程序笔记   发布时间:2022-07-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了django中间件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

django中间件

中间件是 Django 用来处理请求和响应的钩子框架。它是一个轻量级的、底层级的“插件”系统,用于全局性地控制Django 的输入或输出,可以理解为一些关卡。 中间件可以放在你的工程的任何地方,并以Python路径的方式进行访问。 可以把中间件比喻成洋葱,每一层代表一个中间件,每个请求从进入django到响应返回,django都可以通过中间件进行一定的操作。

启用中间件

在setTings.py中,MIDDLEWARE列表表示要启用的中间件。


MIDDLEWARE = [
    # 安全中间件
    'django.middleware.security.Securitymiddleware',
    # 会话中间件,启用时支持session
    'django.contrib.sessions.middleware.SessionMiddleware',
    # “通用”中间件
    'django.middleware wangt.cc mon.CommonMiddleware',
    # CSRF 保护中间件
    'django.middleware.csrf.CsrfViewMiddleware',
    # 验证中间件
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 消息中间件
    'django.contrib.messages.middleware.messageMiddleware',
    # X-Frame-Options 中间件
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

]

上面的是默认的配置,关于这些中间件的功能,可以点击这里查看。

自定义中间件

自定义中间件有两种方法,一种是比较老的方法,另一种是在老方法的基础上的新的定义方式。

    @H_696_59@老方式 要点:
    @H_696_59@自定义一个from django.utils.deprecation.Middlewaremixin的子类 @H_696_59@为类写钩子函数(钩子函数如下表
钩子函数 执行时机 执行顺序(相对与配置列表) 参数 返回值
process_request 请求刚到来,执行视图之前 正序 httprequest对象 None或者httpResponse对象
process_response 视图执行完毕,返回响应时 逆序 httprequest对象和httpResponse对象 httpResponse对象
process_view process_request之后,路由转发到视图,执行视图之前 正序 httprequest对象, 视图函数, view args参数, view kwargs参数 None或者httpResponse对象
process_exception 视图执行中发生异常时 逆序 httprequest对象和异常类对象 None或者httpResponse对象
process_template_response 视图刚执行完毕,process_response之前 逆序 httprequest对象和TemplateResponse对象 实现了render方法的响应对象

django中间件

各个钩子函数的执行顺序

例子:

# app01/middlewares/miMiddleware.py

from django.utils.deprecation import Middlewaremixin


class @H_919_181@mymiddleWare(Middlewaremixin):

    def process_request(self, request):
        print("处理请求")

    def process_response(self, request, responsE):
        print("返回响应")
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print("在执行%s视图前" % view_func.__name__)

    def process_exception(self, request, exception):
        print("处理视图异常...")
# setTings.py

MIDDLEWARE = [
    "app01.middlewares.mymiddleware.MymiddleWare",
]
    @H_696_59@新方式 不需要继承@H_753_68@middlewaremixin类,而且process_requestprocess_response定义__call__方法中。
class @H_919_181@mymiddleWare:
    def __init__(self, get_responsE):
        self.get_response = get_response

    def __call__(self, request):

        print("处理请求")

        response = self.get_response(request)

        print("返回响应")

        return response

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

        print("在执行%s视图前" %view_func.__name__)

    def process_exception(self,request,exception):
        print("处理视图异常...")
		

同样需要在setTings配置MIDDLEWARE。

应用实例一:IP拦截 如果我们想限制某些IP对服务器的访问,可以在setTings.py中添加一个BLACKLIST(全大写)列表,将被限制的IP地址写入其中。 然后,我们就可以编写下面的中间件了:

from django.http import httpResponseForbidden
from django.conf import setTings

class BlackListMiddleware():

    def __init__(self, get_responsE):
        self.get_response = get_response

    def __call__(self, request):

        if request.META['REMOTE_ADDR'] in getattr(setTings, "BLACKLIST", []):
            return httpResponseForbidden('<h1>该IP地址被限制访问!</h1>')

        response = self.get_response(request)

        return response

应用实例二:DEBUG页面 网站上线正式运行后,我们会将DEBUG改为 false,这样更安全。但是发生服务器5xx系列错误时,管理员却不能看到错误详情,调试很不方便。有没有办法比较方便地解决这个问题呢? 即:

    @H_696_59@普通访问者看到的是500错误页面 @H_696_59@管理员看到的是错误详情Debug页面

利用中间件就可以做到!代码如下:

import sys
from django.views.debug import technical_500_response
from django.conf import setTings


class DebugMiddleware():

    def __init__(self, get_responsE):
        self.get_response = get_response

    def __call__(self, request):

        response = self.get_response(request)

        return response

    def process_exception(self, request, exception):
        # 如果是管理员,则返回一个特殊的响应对象,也就是Debug页面
        # 如果是普通用户,则返回None,交给默认的流程处理
        if request.user.is_superuser or request.META.get('REMOTE_ADDR') in setTings.ADMIN_IP:
            return technical_500_response(request, *sys.exc_info())

我的github 我的博客 我的笔记

大佬总结

以上是大佬教程为你收集整理的django中间件全部内容,希望文章能够帮你解决django中间件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。