Django 2.2:正则表达式 url 匹配
Django 2.2: regex url match
我需要创建一个我的中间件应该忽略的 url 列表。
我需要忽略 /admin/
和它后面的任何 url。
我该如何继续?
如果 "any URL that comes after it" 是指像“/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 列表。
我需要忽略 /admin/
和它后面的任何 url。
我该如何继续?
如果 "any URL that comes after it" 是指像“/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