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文件,官方建议使用中间件做. 下面是用户登陆的测试例子,涉及到的一些方法和使用,先参见这里 ...
随机推荐
- ASP.NET MVC 4 从示例代码展开,连接默认SQL Server数据库
VS2013里面,点击菜单[视图]-[SQL server对象资源管理器],右键点击[SQL Server]节点,选择[添加SQL Server]自动生成. 这只是开始,可以让网上下载下来的例子运行出 ...
- linux下 gdb+coredump 调试偶发crash的程序
1. 打开 core dump 查看是否打开 ulimit -c 如果输出0, 说明没有打开. 方法一:使用命令 ulimit -c unlimited 可以打开,但是只对当前终端有效, 方法二: 配 ...
- SLAM数据集整理
New College Dataset :: Main / Downloads Autonomous Space Robotics Lab: Devon Island Rover Navigation ...
- jenkins服务器上安装配置Android SDK
1.下载Android SDK http://tools.android-studio.org/index.php/sdk/ 我下载的是:android-sdk_r24.4.1-linux.tgz ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析
原文地址:http://www.cnblogs.com/zjiaxing/p/5548265.html 在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/d ...
- TechnoSoftware OPCDA client(1.2.1) Error Codes
OPCDA.NET Client Interface WrapperSummary of OPC Error Codes We have attempted to minimize the numbe ...
- mina使用总结
1.在会话中获得远程IP和端口 @Override public void messageReceived(IoSession session, Object message) throws Exce ...
- [PHP]PDO各方法在发生MYSQL断开时的反应
1.mixed PDO::errorCode ( void ) 如果单独执行此语句,并不能判断此时MYSQL是否已断开,它返回最上一次对MYSQL操作的错误码 2.public array PDO:: ...
- LINUX-redis & mongodb
ubuntu安装redis: apt-get -y install redis-serverubuntu启动redis: /etc/init.d/redis-server restart linux安 ...
- hbase搭建
0. 软件版本下载 http://mirror.bit.edu.cn/apache/hbase/ 1. 集群环境 Master 172.16.11.97 Slave1 172.16.11.98 S ...