django框架之中间件 Auth模块
CBV加装饰器
方式一:装饰器加到想装饰的方法上
方式二:装饰器加到class前面,通过name参数指定被装饰的方法
方式三:重写dispatch(django分发CBV视图函数),直接给dispatch装饰,该类中所有对象方法都将被装饰
from django.shortcuts import render, HttpResponse, redirect from django.views import View from functools import wraps from django.utils.decorators import method_decoratordef login(request):if request.method == 'POST':name = request.POST.get('name')pwd = request.POST.get('pwd')if name == 'Tom' and pwd == '123':request.session['name'] = 'Tom'return redirect('/home/')return render(request, 'login.html')def login_auth(func):@wraps(func)def inner(request, *args, **kwargs):if request.session.get('name'):return func(request, *args, **kwargs)return redirect('/login/')return inner# @method_decorator(login_auth, name='get') # 第二种,name参数必须指定 class MyHome(View):@method_decorator(login_auth) # 第三种,拦截django分发视图函数的过程def dispatch(self, request, *args, **kwargs):super().dispatch(request, *args, **kwargs)# @method_decorator(login_auth) # 第一种def get(self, request):return HttpResponse('get')def post(self, request):return HttpResponse('post')
中间件
处理Django的请求和响应的框架级别的钩子,相当于django的门户;
用于在全局范围内改变Django的输入和输出的插件系统,
本质上就是一个自定义类,Django框架会在请求的特定的时间去执行这些方法。
django中间件可以实现网站全局相关的功能校验:身份验证(RBAC基于角色的权限管理),黑白名单、访问频率限制、反爬相关....
中间件在settings.py的MIDDLEWARE配置列表参数:'应用名.文件夹名.文件名.类名'
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', ]
django默认7个中间件,给用户提供五个自定义中间件的方法:
process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
1)process_request 请求时触发,从上往下依次执行,没有该方法则直接通过 ******
返回值None:继续往后执行;
返回HttpResponse对象:将从同级别process_response返回该对象给浏览器
2)process_view 路由匹配成功,执行视图函数之前触发,从上往下依次执行
返回值None:继续往后执行;
返回HttpResponse对象:将从下往上依次执行每个process_response,返回该对象给浏览器
3)process_exception 视图函数报错时自动触发,从下往上依次执行
4)process_template_response 视图函数返回的对象有一个render()方法时触发(或表明该对象是TemplateResponse对象或等价方法)
从下往上依次执行,中间报错无返回函数,不会执行
5)process_response 响应时触发,从下往上依次执行 ******
必须将response形参接收的数据返回,不然直接报错
自定义中间件
1. 新建一个文件夹,放入自定义中间件.py文件
2. 导模块导入MiddlewareMixin
3. 自定义继承MiddlewareMixin的类(中间件)
4. 将自定义中间件路径在settings.py文件中的 MIDDLEWARE列表 注册
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponseclass MyMiddleWare(MiddlewareMixin):def process_request(self, request):print('process_request 自定义No.1 方法')# return HttpResponse('haha')def process_response(self, request, response):print('process_response 自定义No.1 方法')return responsedef process_view(self, request, view_func, view_args, view_kwargs):print('process_view 自定义No.1 方法')print(view_func.__name__, view_func)return HttpResponse('**************')def process_exception(self, request, exception):print('process_exception 自定义No.1 方法')print(exception)def process_template_response(self, request, response):print('process_template_response 自定义No.1 方法')return responseclass MyMiddleWare1(MiddlewareMixin):def process_request(self, request):print('process_request 自定义 No.2 方法')# return HttpResponse('xixi')def process_response(self, request, response):print('process_response 自定义No.2 方法')return responsedef process_view(self, request, view_func, view_args, view_kwargs):print('process_view 自定义No.2 方法')print(view_func.__name__, view_func)def process_exception(self, request, exception):print('process_exception 自定义No.2 方法')print(exception)def process_template_response(self, request, response):print('process_template_response 自定义No.2 方法')return response
from django.shortcuts import HttpResponsedef index0(request):print('我是视图函数index')# jhgyuyreturn HttpResponse('index')def index(request):print('我是视图函数index')def render():print("in index/render")return HttpResponse("564K")rep = HttpResponse("OK")rep.render = render# jkgjliereturn rep
'app01.mymiddle.ware.MyMiddleWare','app01.mymiddle.ware.MyMiddleWare1',
Csrf 跨站请求伪造
模拟钓鱼网站过程
def transfer(request):if request.method == 'POST':username = request.POST.get('username')money = request.POST.get('money')others = request.POST.get('others')print('%s 给%s 转了¥%s' % (username, others, money))return render(request, 'transfer.html')
<h1>正常网站</h1> <form action="" method="post"><p>username:<input type="text" name="username"></p><p>money:<input type="text" name="money"></p><p>others:<input type="text" name="others"></p><input type="submit"> </form>
<h1>钓鱼网站</h1> <form action="" method="post"><p>username:<input type="text" name="username"></p><p>password:<input type="text" name="password"></p><p>others:<input type="text"></p><input type="text" name="others" value="Tom" style="display:none"><input type="text"> </form>
钓鱼网站和正常网站页面完全一样(路径有别),在钓鱼网站中,第三个others参数另一方账户无法正常输入,
但提交的数据最终提交到正常网站,操作成功,但转账将将转到别的账户,这样,网站存在很大的风险.......
django框架通过中间件 'django.middleware.csrf.CsrfViewMiddleware',可以动态生成一条随机数据,每刷新一次页面重新生成,将该数据附在提交数据中,若该数据不存在,或者和该网站内部的数据无法匹配上,即拒绝执行后续操作。如何在post请求中携带该数据?可将该该数据隐藏于一个标签:
1. form表单跨站请求伪造:
{% csrf_token %}
2. Ajax跨站请求伪造,data中加入该键值对:
'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
or
'csrfmiddlewaretoken':'{{ csrf_token }}'
页面数据:<input type="hidden" name="csrfmiddlewaretoken" value="CWg1rnImJfBiJrdVV6iGORUQQHrIAkWJn3nU3VdFnJmNXx8FTac1UZk2eIsQa6Cz">
<h1>正常网站</h1> <form action="" method="post">{% csrf_token %}<p>username:<input type="text" name="username"></p><p>money:<input type="text" name="money"></p><p>others:<input type="text" name="others"></p><input type="submit"> </form>
{% csrf_token %}<button>ajax</button><script>$('button').click(function () {$.ajax({url:'',type:'post',data:{'name': 'jason','csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()}, succecc:function (data) {console.log(data)}})}) </script>
单独配置csrf校验
全局校验csrf时,某个视图函数不需要校验;全局不校验时,某个视图函数需要校验?
1.FBV的csrf校验
from django.views.decorators.csrf import csrf_exempt, csrf_protect@csrf_exempt # 不校验csrf def exempt(request):return HttpResponse('exempt')@csrf_protect # 校验csrf def protect(request):return HttpResponse('protect')
2. CBV的csrf校验
csrf_protect 校验:和正常的CBV装饰器一样,三种
# @method_decorator(csrf_protect, name='post') # 第一种 class index2(View):@method_decorator(csrf_protect)def dispatch(self, request, *args, **kwargs): # 第三种super().dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse('get')# @method_decorator(csrf_protect) # 第二种def post(self, request):return HttpResponse('post')
csrf_exempt校验:不能单独给一个函数加校验,只能配置到一个路由下,两种
@method_decorator(csrf_exempt, name='dispatch') # 第一种 class index1(View):# @method_decorator(csrf_exempt) # 第二种def dispatch(self, request, *args, **kwargs):super().dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse('get')def post(self, request):return HttpResponse('post')
Auth模块
django自带的用户功能模块
常用语句:
auth.authenticate(request, **kwargs) 查询用户
.login(request, user_obj) 记录用户登录状态,任何地方request.user获取登录对象
User.objects.create(**kwargs) 新建用户,密码是明文
.create_user(**kwargs) 新建用户,普通用户
.create_auperuser(**kwargs) 新建vip,必须有Email,具有Django后台管理登录权限
request.user 获取当前登录对象
.is_authenticated() 是否登录
.password 查询密码
.check_password('num') 核对密码是否正确
.set_password('num') 修改密码
.save() 保存修改
logout(request) 退出登录
命令行创建超级用户 python3 manage.py createsuperuser
登录
from django.contrib import authdef auth_login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# models.User.objects.filter(username=username, password=password).first()user_obj = auth.authenticate(request, username=username, password=password) # 查看是否存在if user_obj:# 记录用户状态 request.session['name'] = 'jason'auth.login(request, user_obj) # 生成记录后,通过request.user获取到当前登录对象return HttpResponse('ok')return render(request, 'auth_login.html')
def auth_index(request):print(request.user.is_authenticated()) # 判断当前用户是否登录print(request.user, type(request.user)) # 获取当前登录用户对象return HttpResponse('index')def auth_logout(request):auth.logout(request) # request.session.flush() 退出登录return HttpResponse('ok')
注册
from django.contrib.auth.models import Userdef auth_register(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')user_obj = auth.authenticate(request, username=username) # 查看是否存在if user_obj:return HttpResponse('当前用户已存在!')# User.objects.create(username=username, password=password) # 密码是明文# User.objects.create_user(username=username, password=password) # 普通用户User.objects.create_superuser(username=username, password=password, email='123@qq.com') # vip,必须有Emailreturn render(request, 'auth_register.html')
修改密码
def auth_password(request):print(request.user.password) # 拿到密码(密文)is_true = request.user.check_password('123') # 核对密码if is_true:request.user.set_password('321') # 修改密码request.user.save() # 保存修改return HttpResponse('change ok')
登录验证
auth模块提供登录验证功能,需导入login_required
from django.contrib.auth.decorators import login_required# 局部登录验证 @login_required(login_url='/auth_login/') # 默认跳转登录'/login/',路径不同则需指定 def auth_home(request):return HttpResponse('必须登录才能访问')
所有视图函数都需要登录验证,可以在settings.py设置全局登录参数配置
# auth 没有登录,则自动跳转登录页面 LOGIN_URL = '/auth_login/'
Auth模块自定义表
1. 导入模块中的数据:User, AbstractUser
2. 在settings.py中配置好参数,使用自定义的表名
AUTH_USER_MODEL = 'app名.models对应的模型表名'
3. 在使用Auth模块的的常用语句时,使用自定义类名即可
models.py
from django.db import models from django.contrib.auth.models import User, AbstractUserclass UserInfo(models.Model): # 第一种:一对一关联表(了解)phone = models.CharField(max_length=32)avatar = models.CharField(max_length=32)ab = models.OneToOneField(to=User)class Userinfo(AbstractUser): # 第二种:面向对象的继承AbstractUserphone = models.CharField(max_length=32)avatar = models.CharField(max_length=32)
settings.py
# 告诉django不在使用默认的auth_user,使用自定义的表 AUTH_USER_MODEL = 'app01.Userinfo'
转载于:https://www.cnblogs.com/zhouyongv5/p/11047224.html
django框架之中间件 Auth模块相关推荐
- Django框架 之 中间件
Django框架 之 中间件 浏览目录 中间件介绍 自定义中间件 中间件的执行流程 中间件版登录验证 一.中间件介绍 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个 ...
- python写数据库中间件_python3开发进阶-Django框架的中间件的五种用法和逻辑过程...
阅读目录 一.什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. 每个中间件组件都 ...
- django框架之中间件
内容回顾: 内容回顾:https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie是 ...
- django python3会员中心_python3开发进阶-Django框架的自带认证功能auth模块和User对象的基本操作...
阅读目录 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: authenticate( ...
- django的权限认证:登录和退出。auth模块和@login_required装饰器
在settings.py中配置LOGIN_URL参数: # 用户访问带有(@login_required)标签的页面(view)时,如果没有登录,就会跳转到LOGIN_URL(即登陆url). LOG ...
- Python攻城师的成长————Django框架(csrf相关装饰器、基于中间件思想编写项目、auth认证模块)
今日学习目标 逐步掌握csrf相关装饰器.基于中间件思想编写项目.auth认证模块知识点 文章目录 今日学习目标 学习内容 一. csrf相关装饰器 二.基于中间件思想编写项目 三.auth认证模块 ...
- django中间件和auth模块
django中间件 首先django自带7个中间件,每个中间件都有各自对应的功能 并且django还支持程序员自定义中间件 在用django开发项目的时候,只要涉及到全局相关的功能都可以使用中间件方便 ...
- Django框架之Auth模块
一.什么是Auth认证模块 auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之 ...
- django使用auth模块进行身份认证
https://docs.djangoproject.com/zh-hans/2.0/topics/auth/default/#authentication-in-web-requests djang ...
最新文章
- Android应用中通过AIDL机制实现进程间的通讯实例
- python数据挖掘是什么_python数据挖掘是什么
- short,int,long ,long long ,_int64类型的范围详解
- 原创 - 前后端分离,以及前端的一些操作
- [DFS|回溯法] leetcode 17 电话号码的字母组合
- php十六进制字符串转成字节数组_PHP中的数据类型及实例演示
- 《Python机器学习——预测分析核心算法》——2.4 基于因素变量的实数值预测:鲍鱼的年龄...
- [原创] 对于深度学习(deep learning)在工业界的应用现状和突破 [by matthewbai]
- 大师兄科研网_挑战杯经验分享会与你话科研
- 根据输入的银行卡号识别出银行名称并显示
- 弹出框(bootStrap模态框、bootbox、dbailog)
- 实现lightbox效果
- docker进阶:自定义镜像、网络架构(二)
- 渲云渲染农场怎么样?云渲染价格便宜吗?
- python-Excel多个表格合并
- PostgreSQL学习篇9.3 浮点数类型
- 业务团队为何要实施CRM系统?
- Error response from daemon: conflict: unable to delete ea2bf0a30abf
- Pspice积分线路仿真问题汇总(压控电压源模拟理想运放)
- 安卓的emoji表情转换为文字
热门文章
- java基础知识点(6)——循环语句for-while
- 如何快速的入门git实现版本控制
- Linux怎么添加交换空间,如何在Ubuntu上增加swap交换空间
- kubernetes权威指南第五版_Java 微服务实用指南(二)
- java源代码连接jsp,java网络五子棋的源代码-JSP教程,Java技巧及代码
- linux drbd同步,DRBD数据镜像主备节点同步数据
- c语言用if如何删除末尾空格,新人提问:如何将输出时每行最后一个空格删除
- ibatis mysql_mysql +ibatis
- 五子棋项目结束总结_五子棋编程思想小结
- java安装后启动程序在哪_java – 有没有办法在安装后使用一些“帮助应用程序”立即启动应用程序?...