在我的Django应用程序中,我有以下的have模式:
urlpatterns = [
url(r'^$', schema_view, name='swagger'),
url(r'^(?P<page_title>.+)/(?P<rev_id>[0-9]+)/$',
WhoColorApiView.as_view(), name='wc_page_title_rev_id'),
url(r'^(?P<page_title>.+)/$',
WhoColorApiView.as_view(), name='wc_page_title'),
]第二个条目将匹配像/en/whocolor/v1.0.0-beta/my_book_title/1108730659/?origin=*这样的路径,第三个条目将匹配像/en/whocolor/v1.0.0-beta/my_book_title/?origin=*这样的路径。
其思想是,它匹配一个page_title参数(维基百科文章标题)和一个可选的整数rev_id (修订id)参数。
然而,它的工作方式并不像一篇题为“9.11事件后”的文章( path /en/whocolor/v1.0.0-beta/Post-9%2f11/?origin=* )。我希望这不匹配第二个模式(它被匹配为page_title "Post-9“和rev_id 11),而是匹配第三个模式。
如果路径是/en/whocolor/v1.0.0-beta/Post-9/11/?origin=*,我理解为什么第二个模式应该匹配,但是当标题被url编码为"Post-9%2f11“时,它仍然匹配第二个模式,而不是继续到第三个模式。
如何使Django将url编码的斜杠视为参数的一部分而不是路径分隔符?
发布于 2022-09-10 09:45:39
在Django中有一种叫做路径转换器的东西。
现有的路径转换器之一是用斜线来处理事情。
path -匹配任何非空字符串,包括路径分隔符'/‘。这允许您与完整的URL路径匹配,而不是像str那样匹配URL路径的一部分。
path('<path:page_title>/',
views.post_detail,
name='post_detail'),当你使用路径时,你不需要逃避任何东西,它就能工作。有许多类似OP的例子,其中Path被用作解决方案,例如:
正如伊万·斯塔尔斯丁( Ivan Starostin 评论中提到的 )所言,OP实际上应该使用路径转换器段塞。
根据医生的说法
段塞是某物的短标签,只包含字母、数字、下划线或连字符。
例如,building-your-1st-django-site。
为此,建议OP在模型中使用SlugField类型的字段。
slug = models.SlugField(max_length=250)然后在urls.py里
path('<slug:post>/',
views.post_detail,
name='post_detail'),https://stackoverflow.com/questions/73628806
复制相似问题