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"})
)
Django中间件 及 form 实现用户登陆的更多相关文章
- 基于gin框架和jwt-go中间件实现小程序用户登陆和token验证
本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...
- django 使用装饰器验证用户登陆
使用装饰器验证用户登陆,需要使用@method_decorator 首先需引用,method_decorator,并定义一个闭包 from django.utils.decorators import ...
- 如何批量的在django中对url进行用户登陆限制
参考URL: https://blog.csdn.net/hanshengzhao/article/details/79540306?utm_source=blogxgwz0 1,首先定义一个内部有装 ...
- Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09
目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...
- 五.数据库同步,创建django用户,用户登陆过程
(1)配置数据库 项目目录/settings.py是一个普通的python模块,每项配置都是一key/value 数据库的配置是以dict的形式存放在这个模块中,key名为:DATABASES DAT ...
- [PHP] - Laravel - 用户登陆中间件
前言 Laravel 4中,可以使用Route::filter,而在Laravel 5中,没有了filter.php文件,官方建议使用中间件做. 下面是用户登陆的测试例子,涉及到的一些方法和使用,先参 ...
- Redis & Python/Django 简单用户登陆
一.Redis key相关操作: 1.del key [key..] 删除一个或多个key,如果不存在则忽略 2.keys pattern keys模式匹配,符合glob风格通配符,glob风格的通配 ...
- day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号
python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...
- [PHP]用户登陆中间件
Laravel 4中,可以使用Route::filter,而在Laravel 5中,没有了filter.php文件,官方建议使用中间件做. 下面是用户登陆的测试例子,涉及到的一些方法和使用,先参见这里 ...
随机推荐
- 20165231 2017-2018-2 《Java程序设计》第4周学习总结
教材学习内容总结 第五章 子类与父类: 所谓的子类,必须是一个类继承了另一个类,这个类才是子类:比如:public class A extend B这就是说A类继承了B类,那么A就是B的子类:B是A的 ...
- python 实现神经网络算法
注: Scratch是一款由麻省理工学院(MIT) 设计开发的一款面向少年的简易编程工具.这里写链接内容 本文翻译自“IMPLEMENTING A NEURAL NETWORK FRO ...
- NandFlash和iNand【转】
转自:https://www.cnblogs.com/PengfeiSong/p/6380447.html nand 1.nand的单元组织:block与page(大页Nand与小页Nand)(1)N ...
- 深度神经网络(DNN)是否模拟了人类大脑皮层结构?
原文地址:https://www.zhihu.com/question/59800121/answer/184888043 神经元 在深度学习领域,神经元是最底层的单元,如果用感知机的模型, wx + ...
- hibernate框架学习之数据查询(HQL)
lHibernate共提供5种查询方式 •OID数据查询方式 •HQL数据查询方式 •QBC数据查询方式 •本地SQL查询方式 •OGN数据查询方式 OID数据查询方式 l前提:已经获取到了对象的OI ...
- 微信小程序采坑(一)
1.微信小程序如何让text内容空格 <text decode="{{true}}" space="{{true}}"> </text> ...
- ECC加密算法入门介绍 --- 看雪
标 题:ECC加密算法入门介绍 作 者:zmworm 时 间:2003/05/04 08:32pm 链 接:http://bbs.pediy.com ECC加密算法入门介绍 作者 :ZMWorm[C ...
- 解决:org.xml.sax.SAXParseException: 元素类型 "head" 必须由匹配的结束标记 "</head>问题
事件背景: 今天就碰到了这样的问题, org.xml.sax.SAXParseException: 元素类型 "head" 必须由匹配的结束标记 "</head&g ...
- 接口签名进行key排序,并MD5加密
import org.apache.commons.codec.digest.DigestUtils; import java.io.UnsupportedEncodingException; imp ...
- 时间日期date/cal
命令: date 作用: 查看下系统时间 使用: date 命令: cal 对应英文: calendar 作用: 查看日历 选项: -y:可查看一年的日历 使用: cal cal -y