有条件的Django中间件(或如何排除管理系统)

时间:2009-06-22 16:03:21

标签: python django django-admin django-middleware

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

有没有办法可以配置settings.py或urls.py,或者代码中有什么东西可以防止它在管理系统的页面上执行?

任何帮助非常感谢,

干杯

3 个答案:

答案 0 :(得分:27)

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

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

这样,如果有人将/admin/更改为/django_admin/,您仍然可以获得保障。

答案 1 :(得分:6)

您可以检查process_request中的路径(以及中间件中的任何其他进程_ * - 方法)

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

答案 2 :(得分:0)

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

对于其他不太方便的中间件,我可能会使用上面的piquadrat方法概述,或者只是使用视图装饰器 - 干杯piquadrat!