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

24 投票
2 回答
11871 浏览
提问于 2025-04-15 12:25

我想在我网站的所有页面上使用我写的中间件(页面很多,所以我选择不使用装饰器,因为我想让代码在所有页面上都能用)。唯一的问题是,我不想在管理后台的代码上使用这个中间件,但它似乎在后台也在运行。

有没有办法让我在settings.py或urls.py中配置一下,或者在代码里做点什么,来阻止它在管理系统的页面上执行呢?

非常感谢任何帮助,

保罗


我想这么做的主要原因是我在中间件中使用了一个XML解析器,这导致非XML的下载出现了问题。我添加了一些额外的代码来检测代码是否是XML,并且不去解析那些不应该解析的内容。

对于其他中间件,如果这样做不方便,我可能会使用piquadrat上面提到的方法,或者干脆使用视图装饰器 - 谢谢你,piquadrat!

2 个回答

11

你可以在 process_request 这个方法里检查路径(还有你中间件里的其他 process_* 方法)。

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
42

一种通用的方法是(基于piquadrat的回答)

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

这样,如果有人把 /admin/ 改成 /django_admin/,你仍然可以保证安全。

撰写回答