Django 3.2.6:与 404 相关的应用程序 urls.py 中的路径顺序
Posted
技术标签:
【中文标题】Django 3.2.6:与 404 相关的应用程序 urls.py 中的路径顺序【英文标题】:Django 3.2.6: Path order in app urls.py related to 404 【发布时间】:2022-01-03 06:07:04 【问题描述】:我的urls.py
文件中有多个应用程序communities
的路径。以下是导致问题的两个。
path('posts/<str:username>/<slug:slug>',communities_views.viewPostDetail,name="post_detail")
path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment")
出于某种原因,Django 似乎对这两条路径的顺序感到困惑。当按照所示顺序时,Django 识别出 delete_comment
是一个路径(这意味着在模板中使用 communities:delete_comment
之类的东西在生成模板时不会抛出错误),但是当尝试导航到 url 时,Django 一直在捕获post_detail
的观点和吓坏了。
但是,当我颠倒这两个网址的顺序时,一切正常。顺序重要吗?如果是这样,这对于大型项目来说是相当不方便的。
如果需要任何其他信息,请告诉我。
【问题讨论】:
【参考方案1】:slug:…>
也可以匹配一个数字序列。如果您因此访问posts/delete_comment/123
,那么 Django 将尝试将其与 URL 模式匹配并从第一个模式开始。此 URL 将匹配 posts/<str:username>/<slug:slug>/
模式,因为它设置了 username = 'delete_comment'
和 slug = '123'
。
由于 Django 总是触发第一个匹配的 URL 模式,如果您尝试删除评论,它将触发 viewPostDetail
。
您可以做的是以不同的顺序指定项目:
urlpatterns = [
# ↓ first try to match with the delete_comment URL pattern
path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment"),
path('posts/<str:username>/<slug:slug>',communities_views.viewPostDetail,name="post_detail")
]
另一种选择是制作两个不重叠的 URL 模式,例如:
urlpatterns = [
# ↓ non-overlapping URLs
path('posts/<str:username>/view/<slug:slug>',communities_views.viewPostDetail,name="post_detail"),
path('posts/delete_comment/<int:comment_id>',communities_views.viewDeleteComment,name="delete_comment")
]
【讨论】:
完美!从来不知道关于蛞蝓,两者都像魅力一样工作。以上是关于Django 3.2.6:与 404 相关的应用程序 urls.py 中的路径顺序的主要内容,如果未能解决你的问题,请参考以下文章
Django Elasticbeanstalk 应用程序在自动缩放期间返回 404