在路由到Django中的视图之前是否可以执行操作

时间:2018-09-02 08:25:34

标签: django view

我有包含其他应用程序urls.py的主urls.py,然后调用了相应的视图。 但是,无论应用程序是什么,我都有需要在执行任何操作之前每次执行的操作。是否可以在路由到视图之前执行操作?

1 个答案:

答案 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]中检查此中间件(大部分)的实现。