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

  • Form 验证

  • 密码调用md5 加密存储

  • form.add_error("字段名", "错误信息") 自定义错误信息

  • 装饰器实现 用户认证

  • 中间件实现 用户认证

    1. 中间件顾名思义,是介于requestresponse处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。

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

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

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.messages.middleware.MessageMiddleware',
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. ]

自定义中间件

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

中间件分为五种方法:

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

创建middlwares模块

1.md.py内容中间件值

  1. from django.conf import settings
  2. from django.shortcuts import redirect
  3. # 该 MiddlewareMixin 类为默认继承类,在Django 1.10 之后需要该类的继承,1.7-1.8 无需该类继承
  4. class MiddlewareMixin(object):
  5. def __init__(self, get_response=None):
  6. self.get_response = get_response
  7. super(MiddlewareMixin, self).__init__()
  8. def __call__(self, request):
  9. response = None
  10. if hasattr(self, 'process_request'):
  11. response = self.process_request(request)
  12. if not response:
  13. response = self.get_response(request)
  14. if hasattr(self, 'process_response'):
  15. response = self.process_response(request, response)
  16. return response
  17. class M1(MiddlewareMixin):
  18. # process_request 用于请求时过滤 判断有没有 USER_SESSION_KEY
  19. def process_request(self, request, *args, **kwargs):
  20. # path_info 获取当前URL 的路径值,不带参数的路径
  21. # 如果Url 为 login 就返回一个None 让请求继续
  22. if request.path_info == "/login/":
  23. return None
  24. else:
  25. user_info = request.session.get(settings.USER_SESSION_KEY)
  26. if not user_info:
  27. return redirect("/login/")
  28. # 如果页面出现错误,将请求返回给/index/页面(可以将错误信息记录日志)
  29. def process_exception(self,request,exception):
  30. print("=========",exception)
  31. return redirect("/index/")
  32. # 用于相应时过滤 必须有返回值
  33. def process_response(self, request, response):
  34. print("m1.process_response")
  35. return response

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

  1. # 中间件配置
  2. MIDDLEWARE = [
  3. 'django.middleware.security.SecurityMiddleware',
  4. 'django.contrib.sessions.middleware.SessionMiddleware',
  5. 'django.middleware.common.CommonMiddleware',
  6. 'django.middleware.csrf.CsrfViewMiddleware',
  7. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  8. 'django.contrib.messages.middleware.MessageMiddleware',
  9. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  10. "middlwares.md.M1", # 指定自定义中间件 位置
  11. ]
  12. # SESSION 的别名
  13. USER_SESSION_KEY = "user_info_key"

3.在views.py 中设置值

  1. from django.shortcuts import render, redirect, HttpResponse
  2. # Create your views here.
  3. from app01.forms import LoginForm
  4. from app01 import models
  5. from django.conf import settings # 用户自定义 + 内置的 settings 配置文件
  6. from utils.md5 import md5 # utils 为自定义工具 包
  7. def login(request):
  8. if request.method == "GET":
  9. form = LoginForm()
  10. return render(request, "login.html", {"form": form})
  11. else:
  12. # 将接收到的数据,传给LoginForm()类 通过form 验证;
  13. form = LoginForm(request.POST)
  14. # 通过 form 验证后,form 为True
  15. if form.is_valid():
  16. # 通过form验证的数据 存放在 cleaned_data 中
  17. # form.cleaned_data
  18. form.cleaned_data["password"] = md5(form.cleaned_data["password"])
  19. # 通过 **form.cleaned_data 可以将 数据依照字典形式获取 filter({"username":zhangsan,"password":1234})
  20. userinfo = models.UserInfo.objects.filter(**form.cleaned_data).first() # 拿取第一个对象值
  21. # 如果userinfo 中有数据,即表示验证成功
  22. if userinfo:
  23. # 将 用户信息 放置到 session 中
  24. request.session[settings.USER_SESSION_KEY] = {"id": userinfo.pk, "username": userinfo.username}
  25. # 重定向 页面
  26. return redirect("/index/")
  27. else:
  28. # 用户验证失败,password 错误信息显示在哪个 字段上
  29. form.add_error("password", "用户名或密码错误")
  30. # 存放错误信息 form.errors
  31. # 将 form 清洗过的 数据直接返回给 html 模板
  32. return render(request, "login.html", {"form": form})
  33. def index(request):
  34. return HttpResponse("验证成功!")
  35. # return render(request, "index.html")

4.定义工具模块md5.py

  1. import hashlib
  2. def md5(text):
  3. m = hashlib.md5()
  4. m.update(text.encode("utf-8"))
  5. return m.hexdigest()
  6. if __name__ == '__main__':
  7. text = "zhangsan"
  8. print(md5(text))

5.forms.py 验证配置

  1. from django.forms import Form
  2. # widgets 表示插件
  3. from django.forms import widgets
  4. # fields 表示所有的字段
  5. from django.forms import fields
  6. class LoginForm(Form):
  7. username = fields.CharField(
  8. label="用户名",
  9. required=True, # 表示不能为空,默认不可为空
  10. error_messages={ # 错误信息 依照中文形式显示
  11. "required": "用户名不能为空", # required 为真是错误信息
  12. },
  13. # 插件类型TextInput(attrs={"class": "自定义属性 多个依照空格分隔 form-control 为bootcss属性"})
  14. widget=widgets.TextInput(attrs={"class": "form-control xxx aaa"})
  15. )
  16. password = fields.CharField(
  17. label="密码",
  18. required=True, # 表示不能为空,默认不可为空
  19. error_messages={ # 错误信息 依照中文形式显示
  20. "required": "密码不能为空", # required 为真是错误信息
  21. },
  22. widget=widgets.PasswordInput(attrs={"class": "form-control"})
  23. )

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

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

    本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...

  2. django 使用装饰器验证用户登陆

    使用装饰器验证用户登陆,需要使用@method_decorator 首先需引用,method_decorator,并定义一个闭包 from django.utils.decorators import ...

  3. 如何批量的在django中对url进行用户登陆限制

    参考URL: https://blog.csdn.net/hanshengzhao/article/details/79540306?utm_source=blogxgwz0 1,首先定义一个内部有装 ...

  4. Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09

    目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...

  5. 五.数据库同步,创建django用户,用户登陆过程

    (1)配置数据库 项目目录/settings.py是一个普通的python模块,每项配置都是一key/value 数据库的配置是以dict的形式存放在这个模块中,key名为:DATABASES DAT ...

  6. [PHP] - Laravel - 用户登陆中间件

    前言 Laravel 4中,可以使用Route::filter,而在Laravel 5中,没有了filter.php文件,官方建议使用中间件做. 下面是用户登陆的测试例子,涉及到的一些方法和使用,先参 ...

  7. Redis & Python/Django 简单用户登陆

    一.Redis key相关操作: 1.del key [key..] 删除一个或多个key,如果不存在则忽略 2.keys pattern keys模式匹配,符合glob风格通配符,glob风格的通配 ...

  8. day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

    python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q  (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...

  9. [PHP]用户登陆中间件

    Laravel 4中,可以使用Route::filter,而在Laravel 5中,没有了filter.php文件,官方建议使用中间件做. 下面是用户登陆的测试例子,涉及到的一些方法和使用,先参见这里 ...

随机推荐

  1. Faster_RCNN 1.准备工作

    总结自论文:Faster_RCNN,与Pytorch代码: 代码结构:  simple-faster-rcnn-pytorch.py data __init__.py dataset.py util. ...

  2. MK64FN1M0xxx12_flash.ld链接文件解析

    1.前言 本文主要对MK64FN1M0xxx12_flash.ld文件进行分析,以此来加深对链接文件的理解 2.文件详解 /* ** ################################# ...

  3. java官网真不错

    要用到一个软件,打开时说没找到javaw,然后大家说这是因为没安装java,就按着链接去了java官网 https://www.java.com/zh_CN/download/faq/remove_o ...

  4. CLR via C# 中关于装箱拆箱的摘录

     装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...

  5. VS2008中 ATL CLR MFC Win32 区别

    ATL用于编写COM程序,CLR是.NET的公共语言运行库,MFC是指MFC类库,MFC程序是用这些类库做出的程序,WIN32常规就是不用MFC,使用API函数编的程序.MFC.ATL和CLR是VC2 ...

  6. mysql开启binlog日志和慢查询日志

    1)首先,为什么要开启binlog日志和慢查询日志呢? binlog日志会记录下数据库的所以增删改操作,当不小心删除.清空数据,或数据库系统出错,这时候就可以使用binlog日志来还原数据库,简单来说 ...

  7. jquery获取浏览器URL参数

    getRequestParams:function(param){ var reg = new RegExp("(^|&)" + param + "=([^&am ...

  8. NOIP提高组—— 问题求解 与 完善程序

    问题求解1: 甲乙丙丁四人在考虑周末要不要外出郊游. 已知①如果周末下雨,并且乙不去,则甲一定不去:②如果乙去,则丁一定去:③如果丙去,则丁一定不去:④如果丁不去,而且甲不去,则丙一定不去.如果周末丙 ...

  9. Alpha 冲刺 (5/10)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺5 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 最近事情有点多,只是跟进了下进度,写了写博客 接下来 ...

  10. <TCP/IP>ICMP报文的分类

    Internet控制报文协议,即为ICMP(Internet Control Message Protocal),用于主机,路由器之间传递信息,其目的是让我们能够检测网路的连线状况﹐也能确保连线的准确 ...