Django中间件进行用户登陆验证

通常情况下我们在django中设置登陆验证,使用装饰器来检验是否登陆过。这种情况,我们所有的视图函数都需要加上,太low。

下面我们使用中间件来进行登陆验证~~~

我们先做出登陆页面:

1、models.py

#先在models中设置用户名密码字段
from django.db import models

class UserInfo(models.Model):
    # nid = models.AutoField(primary_key=True)
    # nid = models.BigAutoField(primary_key=True)
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)

2、新建forms.py

from django.forms import Form
from django.forms import fields
from django.forms import widgetsfrom django.core.exceptions import ValidationError

class LoginForm(Form):
    username = fields.CharField(
        label=‘用户名‘,#模板中使用form.username.label
        required=True,
        error_messages={
            ‘required‘:‘用户名不能为空‘
        },
        widget=widgets.TextInput(attrs={‘class‘:‘form-control‘})
    )
    password = fields.CharField(
        label=‘密码‘,
        required=True,
        error_messages={
            ‘required‘: ‘密码不能为空‘
        },
        widget=widgets.PasswordInput(attrs={‘class‘:‘form-control‘})
    )#form钩子
    def clean_username(self):        if not self.cleaned_data.get("username").isdigit():            return self.cleaned_data.get("username")        else:            raise ValidationError("用户名不能全是数字")
 

3、views.py


# ############## 自定义配置 #################USER_SESSION_KEY = "user_info"
from django.conf import settings# 仅用户自定义+内置# from s18day24 import settings    # 仅用户自定义
def login(request):
    #第一次请求走GET,显示初始登陆页
    if request.method == "GET":
        form = LoginForm()
        return render(request,‘login.html‘,{‘form‘:form})
    #如果是post请求,说明用户在登陆
    else:
        #这里我们将request.POST字典完整的抛给form进行form校验
        form = LoginForm(request.POST)
        #如果form校验成功
        if form.is_valid():
            # form.cleaned_data # {‘username‘:‘alex‘,‘password‘:‘xxxx‘}
            # 数据库中查出是否存在用户名密码对应记录models.UserInfo.objects.filter(username=form.cleaned_data[‘user‘],password=form.cleaned_data[‘pwd‘])
            # models.UserInfo.objects.filter(**{‘username‘:‘alex‘,‘password‘:123})
            form.cleaned_data[‘password‘] = md5(form.cleaned_data[‘password‘])
            user = models.UserInfo.objects.filter(**form.cleaned_data).first()
            if user:
                # 将用户信息放置到session中,user.pk是UserInfo表的主键
                request.session[settings.USER_SESSION_KEY] = {‘id‘:user.pk,‘username‘:user.username }
                return redirect(‘/index/‘)
            else:
                form.add_error(‘password‘, ‘用户名或密码错误‘)
        return render(request, ‘login.html‘,{‘form‘:form})
@auth#添加装饰器后使用def index(request):    return HttpResponse(‘欢迎登陆‘)

4、login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    #novalidate不适用浏览器自带验证功能
    <form method="post" novalidate>
        {% csrf_token %}
        #form提供的label属性errors错误字典,form生成html
        <p>{{ form.username.label }}: {{ form.username }} {{ form.username.errors.0 }}</p>
        <p>{{ form.password.label }}: {{ form.password }} {{ form.password.errors.0 }}</p>
        <input type="submit" value="提交">
    </form>
</body>
</html>

md5加密模块

import hashlib

def md5(text):
    m = hashlib.md5()
    m.update(text.encode(‘utf-8‘))
    return m.hexdigest()

5、urls.py模块

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [

    # url(r‘^admin/‘, admin.site.urls),
    url(r‘^login/‘, views.login),
    url(r‘^index/‘, views.index),
    url(r‘^test/‘, views.test),
]

这种情况下,我们是可以轻松直接访问index页面的

我们想让用户在未登录的情况下不允许访问index,需要添加个装饰器来进行校验是否登陆,方法如下。

def auth(func):
    def inner(request,*args,**kwargs):
        # 在登陆时,我们给登陆成功的用户设置了session,在执行视图函数之前,我们获取用户访问session看能否找到
        user_info = request.session.get(settings.USER_SESSION_KEY)
        if not user_info:
            return redirect(‘/login/‘)
        # 执行视图函数
        response = func(request,*args,**kwargs)
        return response
    return inner

dango的生命周期

我们抛开装饰器用户,我们先来说下django一条请求的生命周期

一条请求进入dango我们通常用到的,请求进入我们设置id路由系统,进行url匹配视图函数,在视图函数中进行一些验证、数据库操作、渲染html等操作。

在我们进入url试图函数之前,请求实际还会经过几个中间件,其实就是几个定义的类,我们知道的 csrf校验就是从这里面进行的。

我们可以这样找到这些类

在setting中middleware中定义的就是一个个中间件

我们使用from。。。import的方法ctrl点击找到这个类

原文地址:https://www.cnblogs.com/kunixiwa/p/8157296.html

时间: 2024-08-05 23:30:24

Django中间件进行用户登陆验证的相关文章

django简单用户登陆验证

一.django简单用户登陆验证   前端页面:     <div class="container  col-lg-6  col-lg-offset-4">         <br><br><br><br><br>       <form class="form-signin col-sm-4 col-lg-offset-2" action="{% url 'login' %}

MVC用户登陆验证及权限检查(Form认证)

1.配置Web.conf,使用Form认证方式 <system.web> <authentication mode="None" /> <compilation debug="true" targetFramework="4.6.1" /> <httpRuntime targetFramework="4.6.1" /> <authentication mode="

记录:前端用户登陆验证

登陆页面login.php session_start(); error_reporting(0); require_once ('include.php'); //未解决的问题:能匹配用户名,可是不能匹配密码. // 导致结果:知道用户名,任意密码都能登陆 ?> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title&

Django里自定义用户登陆及登陆后跳转到登陆前页面的实现

因为下一步要和公司的UM帐号作集成,所以分离出登陆模块,及实现其基本功能是必不可少的. 登陆倒容易,但要实现在登陆后,跳转到登陆前的网页,且显示用户的登陆状态,花了点时间查找代码, 测试了五六种方式,终于搞定.连语法都OK啦.. login.html: {% extends "xxxx/index.html" %} {% load staticfiles %} {% block title %}用户登陆 {% endblock %} {% block heading %} <h1

python操作mysql数据库小程序,用户登陆验证

已经建立一个mysql数据库school,里面包含一个表userinfo,表里有3个字段,分别为user_id,username,passwd,即序号(自增字段),用户名,密码. 已经该数据库中存放了若干用户的帐户信息,现在要求用python编写一段小程序,实现由用户输入自己的用户名和密码,完成登陆验证,输入正确的帐号, 显示"welcome",非正确的帐号,显示"failed log in" import pymysql conn = pymysql.connec

Django中间件 及 form 实现用户登陆

Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误信息 装饰器实现 用户认证 中间件实现 用户认证 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性能. django默认的中间件在settings.py中 当用户发起请求

Django+中间件+登陆验证

Django的request请求需要首先经过中间件处理,再通过URL查找到对应的views函数进行处理.在settings的MIDDLEWARE_CLASSES中添加设置中间件进行激活,大致原理如下图所示: 在使用Django框架进行开发的过程中,遇到一个问题:要求对觉得多数页面请求request进行用户登录验证,如果用户没有登录则跳转回到登录页面:如果用户登录了,则直接跳转到新的链接页面? 在django中提供了一种自定义装饰器@login_required来实现验证用户登录: 1 # cod

基于gin框架和jwt-go中间件实现小程序用户登陆和token验证

本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的登陆逻辑在其他博主的文章中已经总结得非常详尽,比如我参考的是这篇博文:微信小程序登录逻辑整理,所以在这里不再赘述,只是大致归纳一下我的实现流程: 在小程序端调用wx.login方法,异步获得到微信下发的 jscode ,然后将 jscode 发送到 golang 服务端(如果需要详细用户信息,见参考

django中的认证登陆与用户的创建

---恢复内容开始--- from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1  authenticate()   提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数 如果认证信息有效,会返回一个  User  对象.authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的.当我们