我有主 urls.py,其中包含其他应用程序 urls.py,然后调用相应的 View 。 但是,无论使用什么应用程序,我都有一个每次执行任何操作之前都需要执行的操作。是否可以在路由到 View 之前执行操作?
最佳答案
是的,您在这里描述的是 middleware [Django-doc] 。您可以将中间件视为一组包装在每个请求-响应周期中的装饰器:因此,您可以在请求传递到 View 之前和之后自由地执行某些任务。/em> 响应从 View 返回。
事实上,您可能已经在不知情的情况下使用了很多中间件:例如,用于检查用户是否登录并将其添加到请求中的身份验证中间件。
您可以通过定义类来定义自己的中间件,例如在 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.
# ... <b>(pre)</b> ...
response = self.get_response(request)
# ... <b>(post)</b> ...
# Code to be executed for each request/response after
# the view is called.
return response
这里 get_response
是它下面的装饰器(最终它是您正在查询的 View )。因此,您可以在注释 (pre)
和 (post)
中添加操作(分别是操作之前和之后 控制权被传递给 View )。
然后您可以在 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',
<b>'app.middleware.MyMiddleware'</b>
]
# ...
请注意,顺序很重要:例如 AuthenticationMiddleware
会将 user
添加到 request
对象。因此,如果您在 AuthenticationMiddleware
之前运行 MyMiddleware
(将其放在列表中较高的位置),则无法使用 request.user
,除非您自己实现它,但这当然只会导致重复的代码。
在某些项目中,可以省略一些中间件。例如,如果您的项目不需要身份验证,那么某些中间件只会使请求到响应过程变慢。通过“抛出”相关中间件,您可以减少请求
到达 View 之前(以及 View 提供的响应返回给客户端之前)完成的工作量。
默认情况下,Django 已将一些中间件添加到 settings.py
文件中。您可以在 source code [GitHub] 中检查(大部分)此中间件的实现。 .
关于django - 是否可以在路由到 django 中的 View 之前执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52135228/