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 = [
    # &downarrow; 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没有在404页面上应用来自应用程序的CSS文件

Swoole系列4.2协程应用与容器

Django Elasticbeanstalk 应用程序在自动缩放期间返回 404

包含 Django 应用程序的 url.py 会导致 404

404来自谷歌应用引擎django应用程序的cron作业

当调试关闭时,启用 Django 语言环境的应用程序总是返回 404