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 实现用户登陆的更多相关文章

  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. 【转】Python之向日志输出中添加上下文信息

    [转]Python之向日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定 ...

  2. web层直接调用 dubbo的服务,合适吗?

    目前很多互联网app项目,都是采用这样的一个基本项目结构:即由后端提供Restful的api接口,然后供前端例如IOS.Android或者H5端去调用,如图: 在这种结构下,后台的代码分层常规一般会有 ...

  3. mlock实现原理及应用【转】

    转自:https://blog.csdn.net/yiyeguzhou100/article/details/78085857 https://wenku.baidu.com/view/e25b4af ...

  4. 红迅JSAAS敏捷开发平台

    红迅JSAAS敏捷开发平台:    http://www.redxun.cn/

  5. Saltstack自动化操作记录(1)-环境部署

    早期运维工作中用过稍微复杂的Puppet,下面介绍下更为简单实用的Saltstack自动化运维的使用. Saltstack知多少Saltstack是一种全新的基础设施管理方式,是一个服务器基础架构集中 ...

  6. Net开发的部分知名网站案例

    .Net开发的部分知名网站案例:http://www.godaddy.com 全球最大域名注册商http://www.ips.com 环迅支付,国内最早的在线支付平台http://www.icbc.c ...

  7. CFtpConnection Class

    CFtpConnection Class   1.链接http://technet.microsoft.com/zh-cn/office/2kywsafk(v=vs.80) 2.测试ftp可以用这个地 ...

  8. java.lang.StackOverflowError 解决方法

    ♦ java.lang.StackOverflowError : 由于深度递归,抛出此错误以指示应用程序的堆栈已耗尽. 在递归中,一个方法在执行期间调用自己.递归被认为是一种强大的通用编程技术,但必须 ...

  9. bzoj 1175: The stairways of Saharna

    一道杨氏矩阵的题,萌新初入门,还不是很懂,这篇 blog 讲的超级好(就是看图有点麻烦) 据说这玩意儿可以代替堆和平衡树用,支持插入.删除.查询,跑得还挺快的(慢着,复杂度好像是 n^2 ? 而且空间 ...

  10. vmware Harbor 复制功能试用

    vmware Harbor 复制功能试用 Harbor基于策略的Docker镜像复制功能,可在不同的数据中心.不同的运行环境之间同步镜像,并提供友好的管理界面,大大简化了实际运维中的镜像管理工作. 功 ...