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. Shell-find . -type f -name "*.php" -print0 | xargs -0 wc -l

    统计一个源代码目录中所有 php 文件的行数

  2. linux系统常用运维命令

    目录/文件处理命令 mkdir dirname         创建文件夹 mkdir -p /tmp/a/b         递归创建目录 rm -rf dirname         删除目录及内 ...

  3. nc 搭建环境流程及问题

    1 拷贝目录,包括eclipse及home两个文件夹 2 将jdk环境配置为home里的jdk,现在为1.5 3 在mde development 中设置数据库链接及应用服务及端口号 4 新建mde项 ...

  4. ES--05

    第四十一讲!分词器内部组成 内置分词器 课程大纲 1.什么是分词器 切分词语,normalization(提升recall召回率) 给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单 ...

  5. python操作三大主流数据库(3)python操作mysql③python操作mysql的orm工具sqlaichemy安装配置和使用

    python操作mysql③python操作mysql的orm工具sqlaichemy安装配置和使用 手册地址: http://docs.sqlalchemy.org/en/rel_1_1/orm/i ...

  6. python安装提示No module named setuptools,wget提示ERROR 403: SSL is required

    在下载安装一个python工具时提示报错No module named setuptools [root@kermit supervisor-3.3.0]$ sudo python setup.py ...

  7. how to avoid inheritance abuse

    Liskov Principle: if S is a subtype of Type T, then any objects of type T may be repalced by objects ...

  8. 行为驱动:BDD框架之Cucumber初探

    1.cucumber cucumber早在ruby环境下应用广泛,作为BDD框架的先驱,cucumber后来被移植到了多平台,简单来说cucumber是一个测试框架,就像是juint或是rspec一样 ...

  9. android经典源码,很不错的开源框架

    高仿最美应用项目源码 项目介绍 这是仿最美应用开发的基于mvp+rxjava+retrofit的项目,很值得学   github地址: https://github.com/JJOGGER/Beaut ...

  10. Confluence 6 SQL Server 数据库驱动修改

    从 Confluence 6.4 开始,我们使用官方的 Microsoft SQL Server JDBC 驱动来替换掉开源的 jTDS 驱动.从这个版本开始所有的安装都会默认使用官方的 Micros ...