我正在尝试在 Django 中定义一个 re_path,以捕获除以 /admin/ 开头的所有 URL。我的目标是将未知 URL 重定向到自定义视图 (RedirectView),同时确保排除所有管理 URL(包括 /admin/mymodel/something/ 等子路径)。
from django.urls import re_path, path
from django.contrib import admin
from . import views
urlpatterns = [
path('admin/', admin.site.urls), # Ensure Django admin URLs are handled
]
# Catch-all pattern that should exclude /admin/ URLs
urlpatterns += [
re_path(r"^.*/(?!admin/$)[^/]+/$", views.RedirectView.as_view(), name="my-view"),
]
问题:
像 localhost:8000/admin/mymodel/something/ 这样的 URL 被正确忽略,这很好。
但是,像 localhost:8000/something/ 这样的单段 URL 没有被匹配,即使它们应该被重定向。
下面的方法
new_pattern
也许能起到作用:图案
original_pattern 演示: https://regex101.com/r/fp5aYg/1
new_pattern 演示: https://regex101.com/r/2AWQcK/5
笔记
可以
new_pattern
以任何非正斜杠字符开头,也/
可以不加任何字符。第一个正斜杠后面不能跟admin/
。每个正斜杠后面/
必须跟至少一个或多个非正斜杠字符,[^/]+
后面跟着一个正斜杠/
:/([^/]+/)+
。字符串必须以正斜杠 结尾/$
。字符串中必须至少有两个正斜杠,且由非正斜杠字符分隔。例如,匹配不会匹配带有两个连续正斜杠的字符串,例如://something//something//
,或something/something//something
^[^/]*
从字符串开头开始。捕获 0 个或多个非正斜杠字符[^/]
,即匹配第一个正斜杠之前的所有内容/
。/
第一个正斜杠。(?!admin/)
第一个斜杠后面不能跟admin/
(?:...)+
非捕获组(?:...)
重复 1 次或多次(+
)。[^/\n]+
捕获任何非正斜杠[^/]
、非换行符\n
1 次或多次。(注意:我必须添加换行符\n
才能使多行演示正常工作。)[^/\n]+/
非正斜杠字符串后面跟着一个正斜杠/
。$
字符串的结尾$
跟在第二个或更后面的正斜杠之后/$
。测试字符串:
匹配项:
不匹配:
调整你的 re_path 以排除 /admin/ URL
好消息是,Django 从上到下匹配路径。因此,如果路径是 ,
admin/…
它将首先查找admin.site.urls
。除非您将管理站点的.final_catch_all_view
属性 [Django-doc]False
设置为,否则它有一个 catchall 可以处理所有带有 的路径code/
。因此,你可以使用 catchall 来:
如果路径没有尾部斜杠,我还会添加一个尾部斜杠,以便让 Django 的[Django-doc]逻辑首先执行一些工作。但如果没有,您可以将其删除。
APPEND_SLASH