django中间件

中间件介绍:

中间件是在request和response处理过程中的一个插件。比如在request到达视图函数之前,我们可以使用中间件来做一些相关的事情,比如可以判断当前这个用户有没有登陆,如果登陆了就绑定一个user对象到request上。也可以在response到达浏览器之前,做一些相关的处理,比如想统一在response上设置一些Cookie信息等。

自定义中间件

中间件有两种方式创建,函数、类。如果该中间件属于某个app的,那么可以在该app下创建一个py文件来写中间件代码。也可以创建一个py包,用来存放所有中间件。

写好的中间件要添加到MIEDDLEWARE最后面,否则不会生效。

函数创建中间件:

# /MyDjango/app1/middlewares.py
def simple_middleware(get_response):                  # 函数名可自定义
    print("项目第一次运行执行的代码")
    def middleware(request):                          # 函数名可自定义
        print("客户端请求数据到达视图函数前执行的代码")
        response = get_response(request)              # 该代码会执行视图函数
        print("服务器响应数据到达浏览器前执行的代码")
        return response                               # 必须返回响应
    return middleware                                 
                                                       # 返回middleware函数对象


# settings.py
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',

    # 添加自定义中间件
    "app1.middlewares.simple_middleeware"
]

Copy

类创建中间件

# /MyDjango/app1/middlewares.py
class SimpleMiddleware:                             # 类名可自定义

    def __init__(self, get_response):               # 参数get_response必须有
        print("项目第一次运行执行的代码")
        self.get_response = get_response            # 保存get_response对象,方便以后调用

    def __call__(self, request):                      # 参数request必须有
        print("客户端请求数据到达视图函数前执行的代码")
        response = self.get_response(request)         # 该代码会执行视图函数
        print("服务器响应数据到达浏览器前执行的代码")
        return response                              # 必须返回响应


# settings.py
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',

    # 添加自定义中间件
    "app1.middlewares.SimpleMiddleware"
]

Copy

执行顺序:

"项目第一次运行执行的代码" ==> "客户端请求数据到达视图函数前执行的代码" ==> "服务器响应数据到达浏览器前执行的代码"

如果还是看不懂,可以Copy代码到自己项目上测试,看看控制台打印内容就明白了。

内置中间件详解

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',   # 安全处理中间件

    'django.contrib.sessions.middleware.SessionMiddleware', # 提供request.session对象

    'django.middleware.common.CommonMiddleware',   # 自动添加斜杠和反爬虫

    'django.middleware.csrf.CsrfViewMiddleware',# CSRF保护的中间件

    'django.contrib.auth.middleware.AuthenticationMiddleware',  # 提供request.user对象

    'django.contrib.messages.middleware.MessageMiddleware',     # 消息相关的中间件

    'django.middleware.clickjacking.XFrameOptionsMiddleware',   # clickjacking保护中间件
]

Copy

反爬虫之请求头验证

# settings.py
import re

DISALLOWED_USER_AGENTS = [
    re.compile(r'^\s$|^$'),
    re.compile(r'.*PhantomJS$.*')
]

Copy

posted @ 2020-09-27 14:43  小默同学  阅读(113)  评论(0编辑  收藏  举报