Django笔记:上下文处理器和中间件

Django笔记:上下文处理器和中间件[Python常见问题]

一、上下文处理器

上下文处理器(一个函数)是用于在模板中定义一些常用的上下文对象,在视图执行完之后,如果视图返回的是HTML模板,那么就会自动执行上下文处理器,并将执行结果(一个字典,就像rendercontext参数)作为模板的上下文对象渲染到HTML模板中。

1. 自定义上下文处理器

定义上下文处理器其实就是定义一个普通的函数,需要注意:该函数的参数必须是request,返回值必须是一个字典,最后把这个函数注册到settings.pyTEMPLATES.OPTIONS.context_processors中就可以了。
在视图执行完之后,如果视图返回的是HTML模板,那么就会去执行这个函数,并将返回的字典作为上下文应用到模板中。

# 参数必须是request
def front_user(request):
    # 返回值必须为字典
    context = {}
    
    # 可以给字典添加一些内容
    # ....

    return context

2. 内置上下文处理器

在新建项目后,settings.pyTEMPLATES.OPTIONS.context_processors中会默认配置一些内置的上下文处理器,这些处理器的详细作用可以查看它的源码,有些处理器的源码其实并不复杂,使用的时候可以参考参考:

  • django.template.context_processors.debug:可以在模板中查看两个变量的值,即debugsql_queries,表示是否是处于DEBUG模式和执行过的数据库查询语句。但是要使用这两个变量,还需要将本机的ip加入到settings.py中的INTERNAL_IPS(列表)中。
  • django.template.context_processors.request:在模板中也可以直接使用视图的request参数。
  • django.contrib.auth.context_processors.auth:Django有一个内置的用户系统,会在模板的上下文中自动添加一个user对象。
  • django.contrib.messages.context_processors.messages:在模板的上下文中添加一个messages变量。使用示例如下:
from django.shortcuts import render
from django.contrib import messages


def message_view(request):
    # 导入messages后,直接使用以下两种方法设置消息内容即可
    # 设置完成后在render中不用传入,直接在模板中使用即可,如:{% for message in messages%}...{% endfor %}
    messages.add_message(request, messages.INFO, "这是一个INFO级别的消息!")
    messages.DEBUG(request, "这是一个DEBUG级别的消息!")
    return render(request, "message_view.html")

二、中间件

Django中的中间件其实就是一些在requestresponse处理过程中进行一些额外操作的插件,比如在视图处理request之前或者response返回给浏览器之前做一些额外的处理。

1. 自定义中间件

中间件的定义其实就是定义一个普通的装饰器,然后将该装饰器(中间件)注册到settings.pyMIDDLEWARE列表中就可以了。根据装饰器的原理可知,运行项目时,在项目启动加载装饰器时就会执行一部分代码,这部分代码在整个项目运行期间只会执行一次,然后每次在请求到达视图之前以及在响应发送给浏览器之前也会执行一部分代码,具体见示例。
函数形式中间件

# 其实就是定义一个装饰器,函数及其参数根据装饰器特性来定义即可
# 需要将定义的中间件函数加入到settings.py的MIDDLEWARE列表中
def front_user_middleware(get_response):
    # 在项目启动时执行一些初始化的代码
    def middleware(request):
        # 每次视图处理之前执行的一些处理
        response = get_response(request)
        # 每次response返回给浏览器之前执行的一些处理
        return response
    return middleware

类形式中间件

# 也是一个装饰器,不过是用类的形式来定义
class FrontUserMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # 执行一些初始化的代码
        
    def __call__(self, request):
        # 视图处理之前执行的一些处理
        response = self.get_response(request)
        # response返回给浏览器之前执行的一些处理
        return response

2. 内置中间件

新建一个项目后,通常会自动配置一些中间件,另外也有一些没有配置的内置中间件,如果需要用到,也可以添加进去,这些中间件的具体作用可以参考下源码:

  • django.middleware.security.SecurityMiddleware:安全处理中间件,比如XSS防御的请求头或者将HTTP协议转为HTTPS协议等。
  • django.middleware.gzip.GZipMiddleware:如果返回的响应的数据部分长度大于了200,那么会先将数据压缩后再返回给浏览器。注意这个中间件是没有自动配置到Django项目中的, 手动配置时需要注意一下添加顺序,可以放在SecurityMiddleware后。
  • django.contrib.sessions.middleware.SessionMiddleware:session处理中间件,在request到达视图之前给它添加一个处理好的session对象,所以在代码中才能使用request.session的方式对session进行操作。
  • django.middleware.common.CommonMiddleware:做一些通用的处理,常用的有两个功能,一个是:开发者定义url时如果末尾有斜杠,但是用户访问时没有添加这个斜杠,那么此中间件会在用户访问时自动重定向到有斜杠的url;另一个是:通过在settings.py中配置DISALLOWED_USER_AGENTS列表,列表中使用正则表达式定义请求头中User-Agent项的查找条件,表示如果请求头中的User-Agent满足这些条件时则此请求不进行处理,在进行一些反爬虫操作时可以使用这个功能。
# settings.py中配置DISALLOWED_USER_AGENTS
import re
DISALLOWED_USER_AGENTS = [
    re.compile(r"^s$|^$"),
    re.compile(r".*PhantomJS.*")
]
  • django.middleware.csrf.CsrfViewMiddlewareCSRF保护的中间件。
  • django.contrib.auth.middleware.AuthenticationMiddleware:给request添加一个user对象。
  • django.contrib.messages.middleware.MessageMiddleware:消息处理中间件。
  • django.middleware.clickjacking.XFrameOptionsMiddlewareclickjacking攻击的保护。
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Django笔记:上下文处理器和中间件