• 中间件


    1.中间件

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

    开Django项目的Settings.py文件,看到下面的MIDDLEWARE配置项,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',
    ]
    

    2.请求生命周期

    img

    3.自定义中间件

     中间件可以定义五个方法,分别是:(主要的是process_request和process_response)

    • 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) 必会

    4.process_request

    process_request有一个参数,就是request,这个request和视图函数中的request是一样的。

    它的返回值可以是None也可以是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器。

    5.process_response

          它有两个参数,一个是request,一个是response,request就是上述例子中一样的对象,response是视图函数返回的HttpResponse对象。该方法的返回值也必须是HttpResponse对象。

    举例:模拟一个网站,无论访问他的那个地址,都要先登录

    在项目中创建一个包,随便起名字,一般都放在一个叫做utils的包里面,表示一个公用的组件,创建一个py文件,随便起名字,内容如下

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import redirect
    class MD1(MiddlewareMixin):
        #请求来了自动执行process_request方法
        #白名单
        white_list = ['/login/']
        def process_request(self, request):
            print("请求来了")
            path = request.path
            if path  not in self.white_list:
    
                status =request.session.get('is_login')
                if not status:
                    return redirect('/login')
    
    
    
        #def process_response(self, request, response):
           # print("请求走了")
          #  return response
    

    在配置文件中设置

    'app01.utils.MD1.MD1'
    

    views

    from django.shortcuts import render,HttpResponse,redirect
    
    def login(request):
        if request.method == 'GET':
    
    
            return render(request,'login.html')
    
        else:
            username = request.POST.get('username')
            pwd = request.POST.get('password')
    
            if username == 'chao' and pwd == '123':
                request.session['is_login'] = True
                #request.session
                # 1 生成随机字符串,
    
    
                return redirect('/index/')
    
            else:
                return redirect('/login/')
    
    
    
    def index(request):
    
        return HttpResponse(1)
    

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <form action="" method="post">
        {% csrf_token %}
        用户名: <input type="text" name="username">
        密码: <input type="text" name='password'>
        <input type="submit">
    </form>
    
    
    </body>
    </html>
    

    执行顺序

    img

    6.process_view

          process_view(self, request, view_func, view_args, view_kwargs)

          该方法有四个参数

          request是HttpRequest对象。

          view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)

          view_args是将传递给视图的位置参数的列表.

          view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。

          Django会在调用视图函数之前调用process_view方法。

          它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用对应的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。

    img

    7.process_exception

    process_exception(self, request, exception)

          该方法两个参数:

          一个HttpRequest对象

          一个exception是视图函数异常产生的Exception对象。

          这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。

    img

  • 相关阅读:
    js函数的属性和方法
    php中str_repeat函数
    html5中的空格符
    php实现简单算法3
    php intval函数
    什么是全栈工程师
    配置Log4j(非常具体)
    【解决】/usr/bin/ld: cannot find -lc
    Java的位运算符具体解释实例——与(&amp;)、非(~)、或(|)、异或(^)
    【小白的java成长系列】——顶级类Object源代码分析
  • 原文地址:https://www.cnblogs.com/zdqc/p/11756119.html
Copyright © 2020-2023  润新知