django - 是否可以在路由到 django 中的 View 之前执行操作

标签 django view

我有主 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/

相关文章:

django - admin View 下的多表继承

view - 插入到 sqlite View 中是如何工作的?

django - Celery 在 AWS ECS 中不起作用

django - 在 Django 之外加载和渲染模板

Django 只在表单中提交 csrf token ?

swift - 如何为 Swift 3 创建第一个 View

安卓。按标签查找 View

python - 在 Django 模型中存储和转义 Django 标签和过滤器

sql - Pyspark Dataframes 作为 View

sql - 如果我更新 View ,我的原始表会更新吗