我有包含其他应用程序urls.py的主urls.py,然后调用了相应的视图。 但是,无论应用程序是什么,我都有需要在执行任何操作之前每次执行的操作。是否可以在路由到视图之前执行操作?
答案 0 :(得分:3)
是的,您在这里描述的是middleware [Django-doc]。您可以将中间件看作是包装在每个请求-响应周期中的一组装饰器:因此,您可以自由地在请求传递到视图之前 和 after < / em>响应从视图返回。
实际上,您可能已经不知道就使用了很多中间件:例如,强化中间件,用于检查用户是否已登录,并将其添加到请求中。
您可以通过定义一个类来定义自己的中间件,例如在app/middleware.py
中(取自文档,并稍作修改):
# app/middleware.py
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
# ... (pre) ...
response = self.get_response(request)
# ... (post) ...
# Code to be executed for each request/response after
# the view is called.
return response
这里get_response
是它下面的装饰器(最终它是您要查询的视图)。因此,您可以在注释(pre)
和(post)
中在此处注明注释的地方添加操作(分别将操作 之前和之后传递给视图)。
然后,您可以在settings.py
文件中注册中间件:
# 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',
'app.middleware.MyMiddleware'
]
# ...
请注意,顺序很重要:例如AuthenticationMiddleware
将向user
对象添加request
。因此,如果您在MyMiddleware
之前运行AuthenticationMiddleware
(将其放在列表中的较高位置),则除非您自己实现,否则无法使用request.user
,但这当然只会导致重复的代码。
在某些项目中,可以省略某些中间件。例如,如果您的项目不需要身份验证,则某些中间件只会使请求响应过程变慢。通过“抛出”相关的中间件,您可以减少request
到达视图之前(以及视图提供的响应返回给客户端之前)的工作量。
默认情况下,Django已将一些中间件添加到settings.py
文件中。您可以在source code [GitHub]中检查此中间件(大部分)的实现。