21

我想使用我在整个网站上编写的一些中间件(大量页面,所以我选择不使用装饰器,因为我想为所有页面使用代码)。唯一的问题是我不想将中间件用于管理代码,而且它似乎对它们很活跃。

有什么方法可以配置 settings.py 或 urls.py ,或者代码中的某些内容以防止它在管理系统的页面上执行?

非常感谢任何帮助,

干杯

保罗

4

4 回答 4

36

一般的方法是(基于piquadrat的回答)

def process_request(self, request):
    if request.path.startswith(reverse('admin:index')):
        return None
    # rest of method

这样,如果有人/admin//django_admin/您进行更改,仍然可以得到保障。

于 2010-07-08T14:04:44.967 回答
9

您可以检查 process_request 中的路径(以及中间件中的任何其他 process_*-methods)

def process_request(self, request):
    if request.path.startswith('/admin/'):
        return None
    # rest of method

def process_response(self, request, response):
    if request.path.startswith('/admin/'):
        return response
    # rest of method
于 2009-06-22T17:04:37.543 回答
1

你不需要到处乱逛。

如果要从视图中排除单个中间件,则必须首先导入该中间件并执行以下操作:

from django.utils.decorators import decorator_from_middleware

from your.path.middlewares import MiddleWareYouWantToExclude

@decorator_from_middleware(MiddleWareYouWantToExclude)
def your_view(request):
    ....

如果您想排除所有中间件,无论它们是/做什么,请执行以下操作:

from django.conf import settings
from django.utils.module_loading import import_string
from django.utils.decorators import decorator_from_middleware

def your_view(request):
    ...

# loop over ALL the active middleware used by the app, import them
# and add them to the `decorator_from_middleware` decorator recursively
for m in [import_string(s) for s in settings.MIDDLEWARE]:
    your_view = decorator_from_middleware(m)(your_view)
于 2021-11-03T12:13:20.417 回答
0

我想这样做的主要原因是在中间件中使用了 XML 解析器,这会弄乱非 XML 下载。我已经添加了一些额外的代码来检测代码是否是 XML,而不是尝试解析任何不应该解析的内容。

对于其他不方便的中间件,我可能会使用上面提到的方法 piquadrat,或者只使用视图装饰器 - Cheers piquadrat!

于 2009-06-23T10:13:38.773 回答