Django 中间件

中间件

中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。

中间件可以定义五个方法,分别是:(主要的是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)

中间件执行流程

在这里插入图片描述

process_request(self,request)

  1. 中间件process_request在请求从wsgi拿到之后执行
  2. 返回response,不在执行后续的中间件process_request方法
  3. 不同中间件之间传递的request都是同一个对象

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

  1. requestHttpRequest对象

    view_func是视图函数的名字

    view_args是视图函数的位置参数

    view_kwargs是视图函数的关键字参数

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

process_template_response(self,request,response)

  1. process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法

process_exception(self, request, exception)

  1. requestHttpRequest对象exception是视图函数异常产生的Exception对象
  2. 这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象

process_response(self, request, response)

  1. request就是请求来的HttpRequest对象response是视图函数返回的HttpResponse对象。该方法的返回值也必须是HttpResponse对象

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 请求到达中间件之后,先按照顺序执行每个中间件的process_request方法,如果process_request方法返回None,就继续顺序执行,如果返回值是HttpResponse对象,就不再执行后续的process_request方法,而是执行对应中间件的process_response方法,将HttpResponse对象返回前端。
  2. process_request方法执行完后,匹配路由,找到要执行的视图函数,在执行视图之前,先执行中间件的process_view方法,如果process_view方法返回None,继续按顺序执行。

中间件版登录验证

路由器:

urlpatterns = [
    url(r'^login/$', views.login, name='login'),
    url(r'^index/$', views.index, name='index'),
]

视图:

from django.shortcuts import render, HttpResponse, redirect


def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        password = request.POST.get('password')
        if user == 'Tom' and password == '666666':
            request.session['user'] = user
            return redirect('/app/index/')
    return render(request, 'login.html')


def index(request):
    return HttpResponse('index')

模版:

<form action="{% url 'app:login' %}" method="post">
    {% csrf_token %}
    <p>
        <label for="user">用户名:</label>
        <input type="text" name="user" id="user">
    </p>
    <p>
        <label for="password">密码:</label>
        <input type="text" name="password" id="password">
    </p>
    <input type="submit" value="登录">
</form>

自定义中间件:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect, HttpResponse


class MyMiddle(MiddlewareMixin):
    white_list = ['white', ]
    black_list = ['black', ]

    def process_request(self, request):
        next_url = request.GET.get('next_url')

        if next_url in self.white_list and request.session.get('user'):
            return
        elif next_url in self.black_list:
            return HttpResponse('这个url是非法的')
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值