我想使用我在整个网站上编写的一些中间件(大量页面,所以我选择不使用装饰器,因为我想为所有页面使用代码)。唯一的问题是我不想将中间件用于管理代码,而且它似乎对它们很活跃。
有什么方法可以配置 settings.py 或 urls.py ,或者代码中的某些内容以防止它在管理系统的页面上执行?
非常感谢任何帮助,
干杯
保罗
我想使用我在整个网站上编写的一些中间件(大量页面,所以我选择不使用装饰器,因为我想为所有页面使用代码)。唯一的问题是我不想将中间件用于管理代码,而且它似乎对它们很活跃。
有什么方法可以配置 settings.py 或 urls.py ,或者代码中的某些内容以防止它在管理系统的页面上执行?
非常感谢任何帮助,
干杯
保罗
一般的方法是(基于piquadrat的回答)
def process_request(self, request):
if request.path.startswith(reverse('admin:index')):
return None
# rest of method
这样,如果有人/admin/
对/django_admin/
您进行更改,仍然可以得到保障。
您可以检查 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
你不需要到处乱逛。
如果要从视图中排除单个中间件,则必须首先导入该中间件并执行以下操作:
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)
我想这样做的主要原因是在中间件中使用了 XML 解析器,这会弄乱非 XML 下载。我已经添加了一些额外的代码来检测代码是否是 XML,而不是尝试解析任何不应该解析的内容。
对于其他不方便的中间件,我可能会使用上面提到的方法 piquadrat,或者只使用视图装饰器 - Cheers piquadrat!