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

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

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

django默认的中间件在settings.py中

     当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

自定义中间件

    自己定义一个中间件,写一个类,但是必须继承MiddlewareMixin     

中间件分为五种方法:

process_request(self,request)                        ***** 用于请求时过滤
process_response(self, request, response)            ***** 用于相应时过滤 必须有返回值
process_view(self, request, callback, callback_args, callback_kwargs)     *** 在执行完所有的process_request 后在回到 起点执行process_view ,然后在执行 视图函数
process_exception(self, request, exception)          ***   对异常信息捕捉
process_template_response(self,request,response)     *     视图函数返回的对象中间有render方法,就会被触发

创建middlwares模块

1.md.py内容中间件值

from django.conf import settings
from django.shortcuts import redirect

# 该 MiddlewareMixin 类为默认继承类,在Django 1.10 之后需要该类的继承,1.7-1.8 无需该类继承
class MiddlewareMixin(object):
    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__()
    def __call__(self, request):
        response = None
        if hasattr(self, 'process_request'):
            response = self.process_request(request)
        if not response:
            response = self.get_response(request)
        if hasattr(self, 'process_response'):
            response = self.process_response(request, response)
        return response

class M1(MiddlewareMixin):
    # process_request 用于请求时过滤 判断有没有 USER_SESSION_KEY
    def process_request(self, request, *args, **kwargs):

        # path_info 获取当前URL 的路径值,不带参数的路径
        # 如果Url 为 login 就返回一个None 让请求继续
        if request.path_info == "/login/":
            return None
        else:
            user_info = request.session.get(settings.USER_SESSION_KEY)
            if not user_info:
                return redirect("/login/")

    # 如果页面出现错误,将请求返回给/index/页面(可以将错误信息记录日志)
    def process_exception(self,request,exception):
        print("=========",exception)
        return redirect("/index/")

    # 用于相应时过滤 必须有返回值
    def process_response(self, request, response):
        print("m1.process_response")
        return response

2.在settings.py中引用该中间件

# 中间件配置
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    "middlwares.md.M1",            # 指定自定义中间件 位置
]

# SESSION 的别名
USER_SESSION_KEY = "user_info_key"

3.在views.py 中设置值

from django.shortcuts import render, redirect, HttpResponse

# Create your views here.
from app01.forms import LoginForm

from app01 import models
from django.conf import settings    # 用户自定义 + 内置的 settings 配置文件
from utils.md5 import md5           # utils 为自定义工具 包

def login(request):
    if request.method == "GET":
        form = LoginForm()
        return render(request, "login.html", {"form": form})

    else:
        # 将接收到的数据,传给LoginForm()类 通过form 验证;
        form = LoginForm(request.POST)
        # 通过 form 验证后,form 为True
        if form.is_valid():
            # 通过form验证的数据 存放在 cleaned_data 中
            # form.cleaned_data

            form.cleaned_data["password"] = md5(form.cleaned_data["password"])

            # 通过 **form.cleaned_data 可以将 数据依照字典形式获取 filter({"username":zhangsan,"password":1234})
            userinfo = models.UserInfo.objects.filter(**form.cleaned_data).first()  # 拿取第一个对象值

            # 如果userinfo 中有数据,即表示验证成功
            if userinfo:
                # 将 用户信息 放置到 session 中
                request.session[settings.USER_SESSION_KEY] = {"id": userinfo.pk, "username": userinfo.username}

                # 重定向 页面
                return redirect("/index/")
            else:
                # 用户验证失败,password 错误信息显示在哪个 字段上
                form.add_error("password", "用户名或密码错误")

        # 存放错误信息 form.errors

        # 将 form 清洗过的 数据直接返回给 html 模板
        return render(request, "login.html", {"form": form})

def index(request):
    return HttpResponse("验证成功!")
    # return render(request, "index.html")

4.定义工具模块md5.py

import hashlib

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

if __name__ == '__main__':
    text = "zhangsan"
    print(md5(text))

5.forms.py 验证配置

from django.forms import Form

# widgets 表示插件
from django.forms import widgets

# fields 表示所有的字段
from django.forms import fields

class LoginForm(Form):
    username = fields.CharField(
        label="用户名",
        required=True,       # 表示不能为空,默认不可为空
        error_messages={     # 错误信息 依照中文形式显示
            "required": "用户名不能为空",       # required 为真是错误信息
        },
        # 插件类型TextInput(attrs={"class": "自定义属性 多个依照空格分隔 form-control 为bootcss属性"})
        widget=widgets.TextInput(attrs={"class": "form-control xxx aaa"})
    )

    password = fields.CharField(
        label="密码",
        required=True,       # 表示不能为空,默认不可为空
        error_messages={     # 错误信息 依照中文形式显示
            "required": "密码不能为空",       # required 为真是错误信息
        },
        widget=widgets.PasswordInput(attrs={"class": "form-control"})
    )

原文地址:https://www.cnblogs.com/baolin2200/p/8157595.html

时间: 2024-10-22 21:03:20

Django中间件 及 form 实现用户登陆的相关文章

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

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

五十二、django 中间件,csrf跨站请求伪造,auth模块表

django 中间件 django中间件事类似django的保安,请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models), 响应走的时候也需要经过中间件才能到达web服务网关接口 django中间件中有五个用户可以自定义的方法 django中间件可以用来做什么? 1.网站全局的身份校验,访问频率限制,权限校验..只要涉及到全局的校验都可以在中间件中完成 2.django的中间件是所有web框架中,做的最好 需要掌握的方法有: 1.proces

☆Django☆---中间件 csrf跨站请求伪造 auth模块 settings功能插拔式源码

Django中间件 django生命周期图 中间件: 概念: Django中间件就类似于 django的保安   请求 的时候需要先经过中间件才能到达django后端(urls, views)   响应 走的时候也需要经过中间件才能到达web服务网关接口 django默认的七个中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Session

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

通常情况下我们在django中设置登陆验证,使用装饰器来检验是否登陆过.这种情况,我们所有的视图函数都需要加上,太low. 下面我们使用中间件来进行登陆验证~~~ 我们先做出登陆页面: 1.models.py #先在models中设置用户名密码字段 from django.db import models class UserInfo(models.Model): # nid = models.AutoField(primary_key=True) # nid = models.BigAutoF

Django:(6)用户认证组件 & 中间件

用户认证组件 用户认证组件: 功能:用session记录登陆验证状态 前提:用户表:django自带的auth_user 创建超级用户的命令: python manage.py createsuperuser API: (1)from django.contrib import auth (auth模块的方法) 1. # 做验证:如果 验证成功 返回 user 对象(就是 auth_user 这张表中的一条记录对象),否则返回None user = auth.authenticate(usern

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' %}

django实现用户登陆访问限制@login_required

我们在网站开发过程中,经常会遇到这样的需求:用户登陆系统才可以访问某些页面 如果用户没有登陆而直接访问就会跳转到登陆界面,而不能访问其他页面. 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址 要实现这样的需求其实很简单: 1.使用django自带的装饰器 @login_required. 2.在相应的view方法的前面添加@login_required 3.并在settings.py中配置LOGIN_URL参数 4.修改login.htlm中的表单action参数 #views.

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

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

Django项目:CRM(客户关系管理系统)--45--36PerfectCRM实现CRM用户登陆注销02

图片另存为  16*16  名字修改为      global_logo.jpg 1 /*! 2 3 *bootstrap.js 4 * 5 * Bootstrap v3.3.7 (http://getbootstrap.com) 6 * Copyright 2011-2016 Twitter, Inc. 7 * Licensed under the MIT license 8 */ 9 10 if (typeof jQuery === 'undefined') { 11 throw new E