【问题标题】:django how can i get the request before the main urls.pydjango 如何在主 urls.py 之前获取请求
【发布时间】:2020-12-18 23:33:31
【问题描述】:

在 django 中我得到了

urlpatterns = [
    path("something/", include("something.urls")),
    path("something2/", include("something2.urls")),
]

我想在他们来到“urlpatterns”之前查看有关请求的详细信息

我想让请求对象每次都在所有 url 中查看 ip,并且即使他去“http://mywebsite.com/blablabla”也不会在他想去的时候遇到问题

如果我不喜欢这个 ip,我想查看请求并能够将状态 400 发回给他

我还想将所有请求发送到 statistic.py 并分析所有请求以查看是否有 cookie 并查看请求的 META 我该如何实现?

【问题讨论】:

  • 你用中间件来做这个。
  • 在“任何人”进入 urlpatterns 之前不要这样做,因为无论如何这都会发生在任何请求之前。正如@WillemVanOnsem 所说,Django 中间件能够拦截到您的应用程序的所有请求。
  • 如果您确实需要仅对某些视图执行此操作,您可以使用视图装饰器执行此操作(例如 stock login_required() 所做的)。

标签: python-3.x django django-models django-views


【解决方案1】:

您可以使用 中间件 来执行此操作。中间件是请求传递到的装饰器堆栈,beforeafter 访问视图。您可以制作简单的中间件为described in the documentation。事实上,您可能已经在使用很多中间件。 request.user.user 是通过请求对象上的中间件添加的。例如,访问的 url 的简单记录器可能如下所示:

# app_name/middleware.py

import logging

logger = logging.getLogger('name_of_my_logger')

def logging_middleware(get_response):
    # One-time configuration and initialization.
    def middleware(request):
        logger.info(request.build_absolute_uri())
        response = get_response(request)
        return response
    return middleware

这里的get_response 是更深层次的装饰器。因此,这是下一个中间件层,最终是视图。你把这个添加到MIDDLEWARE setting [Django-doc]:

MIDDLEWARE = [
    # …,
    'app_name.middleware.logging_middleware',
    # …
]

默认情况下已经有很多中间件检查csrf-tokens,在请求中添加.user等等。如果你用django-admin startproject构建一个Django项目,那么by default there is a set of middleware

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',
]

您可以查找此类 mixin 的源代码,例如 AuthenticationMiddleware [GitHub]

【讨论】:

  • ty :) 这很有帮助
  • 如果这个答案帮助你解决了你的问题,你应该接受它:)
猜你喜欢
  • 2020-11-04
  • 2019-10-30
  • 2012-07-04
  • 2020-07-28
  • 2016-10-15
  • 2018-08-03
  • 2016-05-20
  • 2020-10-26
  • 1970-01-01
相关资源
最近更新 更多