zoukankan      html  css  js  c++  java
  • Django中间件

    Django中间件

    中间件介绍

    官方的说法:中间件是-个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
    但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。
    说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类, 类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。

    用户访问频率限制
    用户是否是黑名单 白名单
    所有用户登录校验
    只要是涉及到网址全局的功能 你就应该考虑使用中间件

    django中间件暴露给程序员五个可以自定义的方法(五个方法都是在特定的条件下自动触发的)

    需要掌握的:
    process_request:请求来的时候 会从上往下依次经过每一个中间件里面process_request,一旦里面返回了HttpResponse对象那么就不再往后执行了 会执行同一级别process_response

    ​ def process_request(self,request):
    ​ print('我是第一个自定义中间件里面的process_request方法')
    ​ return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值") # 直接原地返回

    process_response:响应走的时候 会从下往上依次进过每一个中间件里面的process_response
    def process_response(self,request,response): # response就是要返回给用户的数据
    print("我是第一个自定义中间件里面的process_response方法")
    return response

    了解的
    process_view:路由匹配成功之后执行视图函数之前触发
    process_exception:当视图函数出现异常(bug)的时候自动触发
    process_template_response:当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发

    1. 新建一个文件夹 里面新建一个任意名称的py文件
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    

    class MyMiddle1(MiddlewareMixin):
    def process_request(self,request):
    print('我是第一个自定义中间件里面的process_request方法')
    # return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值")

       def process_response(self,request,response):  # response就是要返回给用户的数据
        print("我是第一个自定义中间件里面的process_response方法")
           return response
       
       def process_view(self,request,view_func,view_args,view_kwargs):
           print(view_func,view_args,view_kwargs)
           print('我是第一个自定义中间件里面的process_view方法')
       
       def process_exception(self,request,exception):
           print(exception)
           print('我是第一个自定义中间件里面的process_exception方法')
       
       def process_template_response(self,request,response):
           print('我是第一个自定义中间件里面的process_template_response方法')
           return response
    

    class MyMiddle2(MiddlewareMixin):
    def process_request(self,request):
    print('我是第二个自定义中间件里面的process_request方法')

       def process_response(self, request, response):  # response就是要返回给用户的数据
           print("我是第二个自定义中间件里面的process_response方法")
           return response
       
       def process_view(self,request,view_func,view_args,view_kwargs):
           print(view_func,view_args,view_kwargs)
           print('我是第二个自定义中间件里面的process_view方法')
       
       def process_exception(self,request,exception):
           print(exception)
           print('我是第二个自定义中间件里面的process_exception方法')
       
       def process_template_response(self,request,response):
           print('我是第二个自定义中间件里面的process_template_response方法')
           return response
    
    
    
    
    里面写类  固定继承
                from django.utils.deprecation import MiddlewareMixin
                class MyMiddle(MiddlewareMixin):
                    ...
    
    2.去配置文件注册到中间件配置中
                    你需要手写字符串的路径
                     'app01.mymiddleware.myaabb.MyMiddle1'
    
    ![](https://img2018.cnblogs.com/blog/1750481/201910/1750481-20191030234810580-262604065.png)
    
    
    
    
    #### 中间件版登录验证:
    
    中间件版的登录验证需要依靠session,所以数据库中要有Django_session表
    
    urls.py:
    
    ```python
    from app02 import views a3 v2
    urlpatterna = [
    	url (r1^admin/',admin. site.ur13),
    	url (r1^1ogin/' ,v2.10gin),
    	url (r'^home/' ,v2.home),
    	url (I' ^index/',v2. index)
    ]
    

    views.py

    from django.shortcuts import render,redirect,HttpResponse
    from app02 import models
    # Create your views here.
    def login(request):
     error_msg=''
     if request.method=='POST':
     username=request.POST.get('username')
     password=request.POST.get('password')
     user_obj=models.User.objects.filter(username=username,password=password)
     if user_obj:
     #设置session
     request.session['login']='ok'
     #获取用户想直接访问的URL
     url=request.GET.get('next')
     #如果有,就跳转到客户初始想访问的URL
     if not url:
     #没有则默认跳转到home页面
     url='/home/'
     return redirect(url)
     else:
     error_msg='username or password error!'
     return render(request,'login.html',{'error_msg':error_msg})
    def home(request):
     return HttpResponse('<h1>这是home页面 只有登录了才能看到</h1>')
    def index(request):
     return HttpResponse('<h1>这是index页面 也只有登录了才能看到<h1>')
    

    login.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>登陆页面</title>
     <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
    <form action="" method="post">
     {% csrf_token %}
     <label for="">username:<input type="text" name="username"></label>
     <label for="">password:<input type="password" name="password"></label>
     <input type="submit" value="submit">
    </form>
    <h1 style="color: red">{{ error_msg }}</h1>
    </body>
    </html>
    
    

    middlewares.py

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import redirect
    class Check_Login(MiddlewareMixin):
     def process_request(self,request):
     next_url=request.path_info
     if not next_url.startswith('/login/'):
     is_login=request.session.get('login','')
     if not is_login:
     return redirect('/login/?next={}'.format(next_url))
    

    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',
     'middleware.my_middleware.Check_Login',
    ]
    
    
  • 相关阅读:
    Redis之使用python脚本监控队列长度
    ELK之filebate收集日志传递至Logstash
    [转] SOLID五大设计原则
    [转] 面向对象原则之GOF是招式,九大原则才是精髓
    [转] (CQRS)命令和查询责任分离架构模式(一) 之 什么是CQRS
    [0] 四色原型
    [0] C#软件项目版本号的命名规则及格式介绍
    [0] AssemblyInfo.cs文件介绍
    [0] 服务器 TCP 提供程序无法在 [ 'any' <ipv4> *] 上侦听。TCP 端口已在使用中。
    [0] C#异常种类
  • 原文地址:https://www.cnblogs.com/zfb123-/p/11768850.html
Copyright © 2011-2022 走看看