中间件

1.什么是中间件

  1. 中间件顾名思义,是介于requestresponse处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能

2.中间件的作用

  1. 如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。
  2. 可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。
  3. Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件)
  4. MIDDLEWARE = [
  5. 'django.middleware.security.SecurityMiddleware',
  6. 'django.contrib.sessions.middleware.SessionMiddleware',
  7. 'django.middleware.common.CommonMiddleware',
  8. 'django.middleware.csrf.CsrfViewMiddleware',
  9. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  10. 'django.contrib.messages.middleware.MessageMiddleware',
  11. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  12. ]

3.自定义中间件

  1. from django.utils.deprecation import MiddlewareMixin
  2. class MyMiddle(MiddlewareMixin):
  3. def process_request(self, request): # request时触发
  4. print('middle request')
  5. def process_response(self, request, response): # response时触发
  6. print('process_response')
  7. return response
  8. def process_view(self, request, callback, callback_args, callback_kwargs): # 路由到视图函数之间触发
  9. print('process_view')
  10. # callback(request)
  11. def process_exception(self, request, exception): # 报错时触发
  12. return HttpResponse(exception)
  13. def process_template_response(self, request, response): # return views.类()时触发
  14. print('i am process_template_response')
  15. print(response)
  16. return views.Test()

4.中间件应用场景

  1. 1.IP访问频率限制
  2. 某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过20次。
  3. 2.URL访问过滤
  4. 如果用户访问的是login视图(放过)
  5. 如果访问其他视图,需要检测是不是有session认证,已经有了放行,
  6. 没有返回login,这样就省得在多个视图函数上写装饰器了!

5.CSRF_TOKEN跨站请求伪造

在form表单中应用:
  1. <form action="" method="post">
  2. {% csrf_token %}
  3. <p>用户名:<input type="text" name="name"></p>
  4. <p>密码:<input type="text" name="password"></p>
  5. <p><input type="submit"></p>
  6. </form>
在Ajax中应用:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <script src="/static/jquery-3.3.1.js"></script>
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. <form action="" method="post">
  10. {% csrf_token %}
  11. <p>用户名:<input type="text" name="name"></p>
  12. <p>密码:<input type="text" name="password" id="pwd"></p>
  13. <p><input type="submit"></p>
  14. </form>
  15. <button class="btn">点我</button>
  16. </body>
  17. <script>
  18. $(".btn").click(function () {
  19. $.ajax({
  20. url: '',
  21. type: 'post',
  22. data: {
  23. 'name': $('[name="name"]').val(),
  24. 'password': $("#pwd").val(),
  25. 'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
  26. },
  27. success: function (data) {
  28. console.log(data)
  29. }
  30. })
  31. })
  32. </script>
  33. </html>
全站禁用

注释掉中间件 'django.middleware.csrf.CsrfViewMiddleware',

局部禁用
  1. FBV
  2. from django.views.decorators.csrf import csrf_exempt,csrf_protect
  3. # 不再检测,局部禁用(前提是全站使用)
  4. # @csrf_exempt
  5. # 检测,局部使用(前提是全站禁用)
  6. # @csrf_protect
  7. def csrf_token(request):
  8. if request.method=='POST':
  9. print(request.POST)
  10. return HttpResponse('ok')
  11. return render(request,'csrf_token.html')
  1. CBV
  2. from django.views import View
  3. from django.views.decorators.csrf import csrf_exempt,csrf_protect
  4. from django.utils.decorators import method_decorator
  5. @method_decorator(csrf_exempt,name='dispatch')
  6. class Foo(View):
  7. def dispatch(self, request, *args, **kwargs):
  8. res = super().dispatch(request, *args, **kwargs)
  9. return res
  10. def get(self,request):
  11. pass
  12. def post(self,request):
  13. pass

Auth模块

1.Auth模块常用方法

  1. from django.contrib import auth
  2. authenticate(request, username=name, password=pwd) 用户认证功能,返回一个 User 对象
  3. login(request, user) 在后端为该用户生成相关session数据
  4. logout(request) 当前请求的session信息会全部清除
  5. is_authenticated() 判断当前请求是否通过了认证
  6. login_requierd() 装饰器,某个视图添加登录校验
  7. 该装饰器需要在settings中添加登录地址
  8. LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由
  9. create_user() 创建新用户
  10. create_superuser() 创建新的超级用户
  11. check_password(password) 提供的一个检查密码是否正确的方法
  12. set_password(password) 修改密码,设置完一定要调用用户对象的save方法

2.User对象的属性

  1. User对象属性:username password
  2. is_staff 用户是否拥有网站的管理权限.
  3. is_active 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

3.扩展默认的auth_user表

  1. model
  2. from django.contrib.auth.models import AbstractUser
  3. class UserInfo(AbstractUser): # 继承父类,并派生新需要的字段
  4. nid = models.AutoField(primary_key=True)
  5. phone = models.CharField(max_length=11, null=True, unique=True)
  6. def __str__(self):
  7. return self.username
  8. 注意,需要在setting中添加AUTH_USER_MODEL = "app名.UserInfo"

中间件和auth模块的更多相关文章

  1. Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09

    目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...

  2. django中间件和auth模块

    Django中间件 由django的生命周期图我们可以看出,django的中间件就类似于django的保安,请求一个相应时要先通过中间件才能到达django后端(url.views.template. ...

  3. Django CBV加装饰器、Django中间件、auth模块

    一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...

  4. Django之csrf中间件及auth模块使用

    目录 一.基于配置文件的编程思想 1. importlib 模块 2. 配置文件 二.跨站请求伪造(csrf) 1.csrf简介以及由来 2.Django中的csrf中间件如何使用 2.1 普通for ...

  5. Django框架之中间件与Auth

    Django框架之中间件与Auth模块一 cbv加装饰器 -先导入:from django.utils.decorators import method_decorator -1 可以在方法上加装饰器 ...

  6. Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块

    目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax c ...

  7. Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)

    Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...

  8. Django CBV装饰器 中间件 auth模块 CSRF跨站请求

    CBV添加装饰器 给CBV添加装饰器有三种方法,三种方法都需要导入模块: from django.utils.decorators import method_decorator 第一种直接在方法上面 ...

  9. Django自带的用户认证auth模块

    一.介绍 基本上在任何网站上,都无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能. 使用Django,我们可以不需要自己写这些功能,因为Dj ...

随机推荐

  1. c语言中的size_t

    size_t unsigned int 类型,无符号,它的取值没有负数.用来表示 参数/数组元素个数,sizeof 返回值,或 str相关函数返回的 size 或 长度.sizeof 操作符的结果类型 ...

  2. 2014ACM/ICPC亚洲区北京站题解

    本题解不包括个人觉得太水的题(J题本人偷懒没做). 个人觉得这场其实HDU-5116要比HDU-5118难,不过赛场情况似乎不是这样.怀疑是因为老司机带错了路. 这套题,个人感觉动态规划和数论是两个主 ...

  3. 自动安装jar包到本地仓库

    参考博客:http://blog.csdn.net/m0_37797991/article/details/73394873

  4. network-scoket

    server: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  5. spring restTemplate 用法

    发出get请求,方式一 String url = serverUrl+"/path/path?id={id}"; int i = restTemplate.getForObject ...

  6. Linux下批量Kill多个进程的方法

    转自http://www.jb51.net/LINUXjishu/43534.html ps -ef|grep tt.py|grep -v grep|cut -c 9-15|xargs kill -9 ...

  7. node自动调试

    supervisor 第一步:安装:npm -g install supervisor没有权限的时候可以sudo npm -g install supervisor 第二步:使用:supervisor ...

  8. LeetCode解题报告—— Sum Root to Leaf Numbers & Surrounded Regions & Single Number II

    1. Sum Root to Leaf Numbers Given a binary tree containing digits from 0-9 only, each root-to-leaf p ...

  9. Internet Explorer 浏览器在同一时刻只能从同一域名下载两个文件。

    Internet Explorer 浏览器在同一时刻只能从同一域名下载两个文件.至于原因请见 MSDN Blogs:<Internet Explorer and Connection Limit ...

  10. SGU 261. Discrete Roots

    给定\(p, k, A\),满足\(k, p\)是质数,求 \[x^k \equiv A \mod p\] 不会... upd:3:29 两边取指标,是求 \[k\text{ind}_x\equiv ...