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模块相关推荐

  1. Django框架 之 中间件

    Django框架 之 中间件 浏览目录 中间件介绍 自定义中间件 中间件的执行流程 中间件版登录验证 一.中间件介绍 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个 ...

  2. python写数据库中间件_python3开发进阶-Django框架的中间件的五种用法和逻辑过程...

    阅读目录 一.什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. 每个中间件组件都 ...

  3. django框架之中间件

    内容回顾: 内容回顾:https://www.cnblogs.com/liwenzhou/p/8343243.html     1. Cookie和Session         1. Cookie是 ...

  4. django python3会员中心_python3开发进阶-Django框架的自带认证功能auth模块和User对象的基本操作...

    阅读目录 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: authenticate( ...

  5. django的权限认证:登录和退出。auth模块和@login_required装饰器

    在settings.py中配置LOGIN_URL参数: # 用户访问带有(@login_required)标签的页面(view)时,如果没有登录,就会跳转到LOGIN_URL(即登陆url). LOG ...

  6. Python攻城师的成长————Django框架(csrf相关装饰器、基于中间件思想编写项目、auth认证模块)

    今日学习目标 逐步掌握csrf相关装饰器.基于中间件思想编写项目.auth认证模块知识点 文章目录 今日学习目标 学习内容 一. csrf相关装饰器 二.基于中间件思想编写项目 三.auth认证模块 ...

  7. django中间件和auth模块

    django中间件 首先django自带7个中间件,每个中间件都有各自对应的功能 并且django还支持程序员自定义中间件 在用django开发项目的时候,只要涉及到全局相关的功能都可以使用中间件方便 ...

  8. Django框架之Auth模块

    一.什么是Auth认证模块 auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之 ...

  9. django使用auth模块进行身份认证

    https://docs.djangoproject.com/zh-hans/2.0/topics/auth/default/#authentication-in-web-requests djang ...

最新文章

  1. Android应用中通过AIDL机制实现进程间的通讯实例
  2. python数据挖掘是什么_python数据挖掘是什么
  3. short,int,long ,long long ,_int64类型的范围详解
  4. 原创 - 前后端分离,以及前端的一些操作
  5. [DFS|回溯法] leetcode 17 电话号码的字母组合
  6. php十六进制字符串转成字节数组_PHP中的数据类型及实例演示
  7. 《Python机器学习——预测分析核心算法》——2.4 基于因素变量的实数值预测:鲍鱼的年龄...
  8. [原创] 对于深度学习(deep learning)在工业界的应用现状和突破 [by matthewbai]
  9. 大师兄科研网_挑战杯经验分享会与你话科研
  10. 根据输入的银行卡号识别出银行名称并显示
  11. 弹出框(bootStrap模态框、bootbox、dbailog)
  12. 实现lightbox效果
  13. docker进阶:自定义镜像、网络架构(二)
  14. 渲云渲染农场怎么样?云渲染价格便宜吗?
  15. python-Excel多个表格合并
  16. PostgreSQL学习篇9.3 浮点数类型
  17. 业务团队为何要实施CRM系统?
  18. Error response from daemon: conflict: unable to delete ea2bf0a30abf
  19. Pspice积分线路仿真问题汇总(压控电压源模拟理想运放)
  20. 安卓的emoji表情转换为文字

热门文章

  1. java基础知识点(6)——循环语句for-while
  2. 如何快速的入门git实现版本控制
  3. Linux怎么添加交换空间,如何在Ubuntu上增加swap交换空间
  4. kubernetes权威指南第五版_Java 微服务实用指南(二)
  5. java源代码连接jsp,java网络五子棋的源代码-JSP教程,Java技巧及代码
  6. linux drbd同步,DRBD数据镜像主备节点同步数据
  7. c语言用if如何删除末尾空格,新人提问:如何将输出时每行最后一个空格删除
  8. ibatis mysql_mysql +ibatis
  9. 五子棋项目结束总结_五子棋编程思想小结
  10. java安装后启动程序在哪_java – 有没有办法在安装后使用一些“帮助应用程序”立即启动应用程序?...