【问题标题】:Django 2.2: regex url matchDjango 2.2:正则表达式 url 匹配
【发布时间】:2019-11-20 08:54:30
【问题描述】:

我需要创建一个我的中间件应该忽略的 url 列表。

我需要忽略/admin/ 以及它之后的任何网址。

我该如何继续?

【问题讨论】:

  • 能否请您展示一下您的网址格式?
  • 你需要展示一些来自中间件的代码。
  • 那你为什么要排除admin呢?只需将其从 urls.py 中删除即可。

标签: python django middleware


【解决方案1】:

如果“后面的任何 URL”是指诸如“/admin/my_app/my_model/...”之类的 URL,那么您可以使用 .startswith()

if not request.path.startswith('/admin/'):
    # do things

如果您想忽略 urls.py/admin/ 之后列出的 URL,您可以遍历默认解析器的 url_patterns 并在任何其他模式匹配之前点击 /admin/ 时停止. 请注意,仅仅因为这似乎是可能的并不意味着这是一个好主意;)

下面是一些可能可以工作的代码,但它很可能不会涵盖任何边缘情况:

from django.urls.exceptions import Resolver404
from django.urls.resolvers import get_resolver

def pattern_after_admin(request):
    """
    Returns True if the request URL matches a pattern listed
    after the `/admin/` pattern or no pattern at all.
    """
    resolver = get_resolver()
    after_admin = False
    for pattern in resolver.url_patterns:
        try:
            pattern.resolve(request.path)
        except Resolver404:
            try:
                pattern.resolve('/admin/')
            except Resolver404:
                pass
            else:
                after_admin = True
                break
        else:
            break
    return after_admin

【讨论】:

  • 好吧,我的问题是,我必须创建一个中间件必须匹配的正则表达式 url 数组,解决方案很简单,我只是太努力了......但你的解决方案可能在路上帮助别人,我会接受的。
猜你喜欢
  • 2011-08-17
  • 2017-09-12
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多