码迷,mamicode.com
首页 > 其他好文 > 详细

中间件

时间:2019-10-28 23:54:53      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:app   ica   eth   doc   turn   exception   Django项目   自定义中间件   none   

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.请求生命周期

技术图片

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>

执行顺序

技术图片

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并返回结果。

技术图片

7.process_exception

process_exception(self, request, exception)

      该方法两个参数:

      一个HttpRequest对象

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

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

技术图片

中间件

标签:app   ica   eth   doc   turn   exception   Django项目   自定义中间件   none   

原文地址:https://www.cnblogs.com/zdqc/p/11756119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!