# 自定义的登录验证中间件
class LoginMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 登录验证逻辑
        if not request.session.get('is_logged_in'):
            return HttpResponse('Please login first!')
        
        response = self.get_response(request)
        return response

# 自定义的请求日志中间件
class RequestLoggingMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 记录请求日志
        print('Request:', request.method, request.path)

        response = self.get_response(request)
        return response

Django中的中间件(Middleware)是一个处理HTTP请求和响应的钩子函数。中间件可以在请求到达视图函数之前和响应返回给客户端之前进行一些处理逻辑。

Django自带了一些中间件,比如SessionMiddleware用于处理会话数据,CsrfViewMiddleware用于CSRF保护等。除了这些自带的中间件,我们还可以自定义中间件来满足项目的特定需求。

上面的代码示例中,我们定义了两个自定义的中间件:LoginMiddleware和RequestLoggingMiddleware。

LoginMiddleware用于验证用户登录状态,如果用户未登录,则直接返回"Please login first!"的响应。

RequestLoggingMiddleware用于记录请求日志,打印请求的方法(request.method)和路径(request.path)。

要使用这些中间件,需要在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.LoginMiddleware',
    'myapp.middleware.RequestLoggingMiddleware',
]

按照定义的顺序,中间件会依次调用处理每个请求,并在响应返回给客户端之前进行一些处理。

通过自定义中间件,我们可以很方便地实现一些公共的功能,如登录验证、请求日志等。