在django中路由到视图之前是否可以执行操作
我有主URL.py,其中包括其他应用程序URL.py,然后调用相应的视图。在django中路由到视图之前是否可以执行操作,django,view,Django,View,我有主URL.py,其中包括其他应用程序URL.py,然后调用相应的视图。 然而,我有一个操作,每次做任何事情之前都需要执行,无论应用程序是什么。是否可以在路由到视图之前执行操作 是的,你在这里描述的是。您可以将中间件视为一组包装在每个请求-响应周期中的装饰器:因此,您可以在请求传递到视图之前和响应从视图返回之后自由地执行某些任务 事实上,您可能已经在不知不觉中使用了很多中间件:例如,检查用户是否登录并将其添加到请求中的身份验证中间件 您可以通过定义一个类来定义自己的中间件,例如在app/mid
然而,我有一个操作,每次做任何事情之前都需要执行,无论应用程序是什么。是否可以在路由到视图之前执行操作 是的,你在这里描述的是。您可以将中间件视为一组包装在每个请求-响应周期中的装饰器:因此,您可以在请求传递到视图之前和响应从视图返回之后自由地执行某些任务 事实上,您可能已经在不知不觉中使用了很多中间件:例如,检查用户是否登录并将其添加到请求中的身份验证中间件 您可以通过定义一个类来定义自己的中间件,例如在
app/middleware.py
(取自文档,稍作修改):
请注意,顺序很重要:例如,AuthenticationMiddleware
将向请求
对象添加一个用户
。如果因此在AuthenticationMiddleware
之前运行MyMiddleware
(将其放在列表的较高位置),则不能使用request.user
,除非您自己实现它,但这当然只会导致重复的代码
在一些项目中,可以安装一些中间件。例如,如果您的项目不需要身份验证,那么某些中间件只会使请求-响应过程变慢。通过“抛出”相关中间件,可以减少请求到达视图之前(以及视图提供的响应返回到客户端之前)所做的工作量
默认情况下,Django已经在settings.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
# 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'
]
# ...