Django中的URL解析有两种模式

Posted

技术标签:

【中文标题】Django中的URL解析有两种模式【英文标题】:URL resolution in Django with two patterns 【发布时间】:2021-07-09 21:09:53 【问题描述】:

在 Django 中需要为任务和子任务提供选项。其中示例任务为abc_123,示例子任务为xyz-987

example.com/abc_123/options
example.com/abc_123/xyz-987/options

我的 urls.py 文件

urlpatterns = [
    url(r'^/(?P<taskId>.+)/options$', views.AvailableOptions.as_view()),
    url(r'^/(?P<taskId>.+)/(?P<subtaskId>.+)/options$', views.AvailableOptions.as_view()),
]

仅发送 taskId 时工作正常。当同时发送任务和子任务 ID 时。该模式将abc_123/xyz-987 作为taskId。我需要将 url 解析为 abc_123xyz-987 分别作为 taskId 和 subtaskId

【问题讨论】:

r'^/(?P&lt;taskId&gt;.+)/options$' 更改为 r'^/(?P&lt;taskId&gt;[^/]+)/options$'。其实r'^/(?P&lt;taskId&gt;.+)/(?P&lt;subtaskId&gt;.+)/options$'也改成r'^/(?P&lt;taskId&gt;[^/]+)/(?P&lt;subtaskId&gt;[^/]+)/options$'比较好 更改网址有效 【参考方案1】:

你不应该匹配斜杠,所以我们可以使用一个匹配除斜杠之外的所有字符的字符组,所以:

urlpatterns = [
    url(r'^/(?P<taskId>[^/]+)/options$', views.AvailableOptions.as_view()),
    url(r'^/(?P<taskId>[^/]+)/(?P<subtaskId>[^/]+)/options$', views.AvailableOptions.as_view()),
]

但是,您可能希望将path(…) [Django-doc] 与&lt;str:…&gt; 路径转换器一起使用,因此:

urlpatterns = [
    path('<str:taskId>/options/', views.AvailableOptions.as_view()),
    path('<str:taskId>/<str:subpathId>/options/', views.AvailableOptions.as_view()),
]

【讨论】:

以上是关于Django中的URL解析有两种模式的主要内容,如果未能解决你的问题,请参考以下文章

python 之 Django框架(路由系统include命名URL和URL反向解析命名空间模式)

Django之URL反向解析

Django框架之URL反向解析静态文件配置以及应用的创建

Django框架之URL反向解析静态文件配置以及应用的创建

django url解析中的ResolverMatch

django的url反向解析