Django框架进阶7 django请求生命周期流程图, django中间件, csrf跨站请求伪造, auth认证模块
Posted ludingchao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架进阶7 django请求生命周期流程图, django中间件, csrf跨站请求伪造, auth认证模块相关的知识,希望对你有一定的参考价值。
django请求生命周期流程图
djang中间件
它是django的门户
只要是全局相关的功能你都应该考虑使用django中间件来帮你完成
全局用户身份校验
全局用户访问频率校验
用户访问黑名单
用户访问白名单
# 只要以后用django开发业务 设计到全局相关的功能 你就考虑用中间件 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支持用户自定义中间件(例)
class SessionMiddleware(MiddlewareMixin): def process_request(self, request): def process_response(self, request, response): class CsrfViewMiddleware(MiddlewareMixin): def process_request(self, request): def process_view(self, request, callback, callback_args, callback_kwargs): def process_response(self, request, response): class AuthenticationMiddleware(MiddlewareMixin): def process_request(self, request):
django运行用户自定义中间件并且暴露给用户五个可以自定义的方法
process_view 路由匹配成功执行视图函数之前触发 process_template_reponse 视图函数返回的对象中必须要有render属性对应的render方法 def index(request): print(‘我是视图函数index‘) def render(): return HttpResponse("你好啊 我是index里面的render函数") obj = HttpResponse("index") obj.render = render return obj process_exception 当视图函数报错的时候自动触发 信号量
跨站请求伪造csrf
钓鱼网站
本质搭建一个跟正常网站一模一样的页面
用户在该页面上完成转账功能
转账的请求确实是朝着正常网站的服务端提交
唯一不同的在于收款账户人不同
给用户书写form表单 对方账户的input没有name属性
你自己悄悄提前写好了一个具有默认的并且是隐藏的具有name属性的input
模拟钓鱼网站
form表单如何通过csrf校验
你只需要在你的form表单内写一个
{% csrf_token %}
ajax如何通过csrf校验
// 第一种方式 自己手动获取 {#data:{‘username‘:‘jason‘,‘csrfmiddlewaretoken‘:$(‘input[name="csrfmiddlewaretoken"]‘).val()},#} // 第二种方式 利用模板语法 {#data:{‘username‘:‘jason‘,‘csrfmiddlewaretoken‘:‘{{ csrf_token }}‘},#} // 第三种 通用方式 引入外部js文件 官网提供的方式 {% load static %} <script src="{% static ‘myset.js‘ %}"></script> data:{‘username‘:‘jason‘}
csrf相关装饰器
当我们网站整体都校验csrf的时候 我想让某几个视图函数不校验
当我们网站整体都不校验csrf的时候 我想让某几个视图函数校验
from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.views import View9 from django.utils.decorators import method_decorator # @method_decorator(csrf_protect,name=‘post‘) # 第二种指名道姓的给类中某个方法装 # @method_decorator(csrf_exempt,name=‘post‘) # csrf_exempt 第二种方式不行 @method_decorator(csrf_exempt,name=‘dispatch‘) # 可以!!! class MyHome(View): # APIView # @method_decorator(csrf_protect) # 第三种 类中所有的方法都装 # @method_decorator(csrf_exempt) # csrf_exempt 第三种方式可以 def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs) def get(self,request): return HttpResponse(‘get‘) # @method_decorator(csrf_protect) # 第一种方式 # @method_decorator(csrf_exempt) # csrf_exempt 第一种方式不行 def post(self,request): return HttpResponse(‘post‘) """ 给CBV加装饰器 推荐你使用模块method_decorator 我们自己写的装饰器和csrf_protect用法一致 唯独csrf_exempt是一个特例 只能给dispatch方法装 """
auth模块
django用户相关的自带的功能模块 auth_user表
如何创建超级用户
createsuperuser
模块导入
from django.contrib import auth from django.contrib.auth.models import User
auth方法大全
1.创建用户 User.objects.create() # 密码是明文 User.objects.createuser() # 基本都用它 User.objects.createsuperuser() # 邮箱要给数据 2.校验用户名和密码是否正确 auth.authenticate(username=username,password=password) # 用户名和密码两个一个都不能少 # 该方法当用户名和密码正确的时候返回的用户对象 不正确返回None 3.保存用户登录状态 auth.login(request,user_obj) # 这一句执行之后 request.user获取当前登录的用户对象 4.如何判断当前用户是否登录 以及如何获取当前登录用户对象 request.user.is_authenticated() # 判断是否登录 request.user # 登录用户对象 5.校验用户是否登录 from django.contrib.auth.decorators import login_required # 局部配置 @login_required(login_url=‘/login/‘) def xxx(request): return HttpResponse(‘xxx页面‘) # 全局配置 配置文件中写以下代码 LOGIN_URL = ‘/login/‘ @login_required def xxx(request): return HttpResponse(‘xxx页面‘) # 如果两个都设置了 那么优先执行局部配置 6.修改密码 request.user.check_password(old_password) # 校验原密码是否正确 request.user.set_password(new_password) request.user.save() # 一定要保存 7.注销功能 auth.logout(request)
如何扩展auth_user表
# 1 利用一对一表关系() # 2 利用类的继承 # 1 类的继承 from django.contrib.auth.models import User,AbstractUser # Create your models here. class Userinfo(AbstractUser): phone = models.BigIntegerField() avatar = models.FileField() # 扩展的字段 尽量不要与原先表中的字段冲突 # 2 配置文件 AUTH_USER_MODEL = ‘应用名.表名‘ """ django就会将userinfo表来替换auth_user表 并且之前auth模块所有的功能不变 参照的也是userinfo表 """
以上是关于Django框架进阶7 django请求生命周期流程图, django中间件, csrf跨站请求伪造, auth认证模块的主要内容,如果未能解决你的问题,请参考以下文章