python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Django中间件Middleware

Django中间件Middleware功能详解

作者:向上的车轮

Django中间件(Middleware)是Django框架中的一个功能,它允许开发者在处理请求和响应的过程中插入自定义代码,中间件能够在视图函数执行前后进行操作,本文给大家介绍Django中间件Middleware功能,感兴趣的朋友一起看看吧

Django中间件(Middleware)是一段在Django的请求/响应处理过程中,可以介入并改变请求或响应的代码。中间件是Django框架中一个非常强大的功能,它允许你在Django的视图函数之前或之后执行自定义代码。

中间件可以用于:

Django中间件的工作原理是,中间件以一个有序列表的形式存在,Django会按照这个列表的顺序调用中间件。

创建中间件

要创建一个中间件,你需要定义一个Python类,该类包含若干个特定的方法。最常用的方法有:

示例

下面是一个简单的中间件示例,它会在每个请求的响应中添加一个自定义的HTTP头部:

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        # 在视图函数之前执行的代码
        response = self.get_response(request)
        # 在视图函数之后执行的代码
        response['X-Custom-Header'] = 'Custom Value'
        return response

使用中间件

要使用中间件,你需要将它添加到你的Django项目的settings.py文件中的MIDDLEWARE列表中:

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',
    'myapp.middleware.SimpleMiddleware',  # 添加你的中间件
    ...
]

确保中间件的顺序符合你的业务逻辑需求。

注意事项

通过中间件,你可以为Django应用添加强大的功能和灵活性。

过滤请求

在Django中,中间件可以用来过滤请求和记录日志。这通常涉及到两个方面:请求处理和响应处理。下面我将介绍如何使用中间件来实现这两个功能。

过滤请求+记录日志

过滤请求通常是指在请求到达视图函数之前,根据某些条件决定是否允许请求继续进行。例如,你可能想要实现一个简单的访问控制,只允许来自特定IP地址的请求通过。

下面是一个简单的中间件示例,它检查请求的来源IP地址,并拒绝非授权的IP:

class IPFilterMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        # 定义允许的IP地址列表
        allowed_ips = ['192.168.1.1', '127.0.0.1']
        # 获取请求的IP地址
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        # 检查IP是否在允许的列表中
        if ip not in allowed_ips:
            # 如果不在允许的列表中,返回403禁止访问
            from django.http import HttpResponseForbidden
            return HttpResponseForbidden("You are not allowed to access this site.")
        # 继续处理请求
        response = self.get_response(request)
        return response

记录日志

记录日志是中间件的另一个常见用途。你可以记录请求的详细信息,比如请求的URL、方法、IP地址等,这对于调试和监控应用非常有用。

下面是一个简单的日志记录中间件示例:

import datetime
class LoggingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        # 请求到达的时间
        start_time = datetime.datetime.now()
        # 处理请求
        response = self.get_response(request)
        # 请求结束的时间
        end_time = datetime.datetime.now()
        # 记录日志
        logger = logging.getLogger(__name__)
        logger.info(
            f'Status Code: {response.status_code} '
            f'| Method: {request.method} '
            f'| Path: {request.path} '
            f'| Time: {(end_time - start_time).total_seconds()}s'
        )
        return response

配置中间件

要使用这些中间件,你需要将它们添加到你的Django项目的settings.py文件中的MIDDLEWARE列表中:

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',
    'myapp.middleware.IPFilterMiddleware',  # 添加IP过滤中间件
    'myapp.middleware.LoggingMiddleware',  # 添加日志记录中间件
    ...
]

确保中间件的顺序符合你的业务逻辑需求。

注意事项

通过合理地使用中间件,你可以有效地控制请求的访问和记录详细的日志信息,这对于维护和监控Django应用非常有帮助。

到此这篇关于Django中间件Middleware的文章就介绍到这了,更多相关Django中间件Middleware内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文