在我的 core/urls.py 文件中找不到 Django 页面 (404)。仅在重新排列网址时有效
Django page not found (404) in my core/urls.py file. Only works when the urls are rearranged
我对 Django 比较陌生。我已经以这种方式在我的 core/urls.py 文件中设置了我的 URL,当我在浏览器上打开 localhost:8000/posts/
时确实收到了 404 错误。代码显示在这里
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<slug:slug>/', views.SingleView.as_view(), name='single'),
path('posts/', views.PostsView.as_view(), name='posts'),
]
但是,当我反转 slug
和 posts/
以使 posts
位于 slug
之前时,一切正常。像这样:
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('posts/', views.PostsView.as_view(), name='posts'),
path('<slug:slug>/', views.SingleView.as_view(), name='single'),
]
请帮我解决一下。
这就是 Django(和大多数其他框架)的工作方式。当收到请求时,Django 将检查您指定的路由,并使用您指定的相同顺序。因此,在您的第一个示例中,''
是第一个,然后是 '<slug:slug>/'
和 'posts/'
。这意味着每次收到请求时,Django 都会检查该订单上的路由。 for 循环的基本工作原理:
示例 URL:yoursite.com/posts/
路径:"posts/"
routes = ["", "<slug:slug>/", "posts/"]
path = "posts/"
for route in routes:
if route == path:
# use view for this route
return
所以在这种情况下,它将匹配索引 1,即 <slug:slug>/
,并且 return 是为其指定的视图。
现在要理解为什么 <slug:slug>/ == "posts/"
returns True
你需要理解 slug
在 Django 中的含义:
slug - Matches any slug string consisting of ASCII letters or numbers, plus the hyphen and underscore characters. https://docs.djangoproject.com/en/3.1/topics/http/urls/#example
因此它将接受符合这些要求的任何路径,并且 posts/
实际上符合这些要求。如果 Django 找到匹配项,它不会检查任何其他路由,因此它永远不会到达 path('posts/', views.PostsView.as_view(), name='posts')
,因为 '<slug:slug>/'
在较小的索引中比 'posts/'
具有更高的优先级。你可能会检查你的模型中不存在的那个 slug,所以它会 return 一个 404.
通过更改路线顺序,您将路线更改为 ["", "posts/", "<slug:slug>/"]
。现在 "posts/"
具有更高的优先级,django 将使用 PostsView
.
我对 Django 比较陌生。我已经以这种方式在我的 core/urls.py 文件中设置了我的 URL,当我在浏览器上打开 localhost:8000/posts/
时确实收到了 404 错误。代码显示在这里
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<slug:slug>/', views.SingleView.as_view(), name='single'),
path('posts/', views.PostsView.as_view(), name='posts'),
]
但是,当我反转 slug
和 posts/
以使 posts
位于 slug
之前时,一切正常。像这样:
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('posts/', views.PostsView.as_view(), name='posts'),
path('<slug:slug>/', views.SingleView.as_view(), name='single'),
]
请帮我解决一下。
这就是 Django(和大多数其他框架)的工作方式。当收到请求时,Django 将检查您指定的路由,并使用您指定的相同顺序。因此,在您的第一个示例中,''
是第一个,然后是 '<slug:slug>/'
和 'posts/'
。这意味着每次收到请求时,Django 都会检查该订单上的路由。 for 循环的基本工作原理:
示例 URL:yoursite.com/posts/
路径:"posts/"
routes = ["", "<slug:slug>/", "posts/"]
path = "posts/"
for route in routes:
if route == path:
# use view for this route
return
所以在这种情况下,它将匹配索引 1,即 <slug:slug>/
,并且 return 是为其指定的视图。
现在要理解为什么 <slug:slug>/ == "posts/"
returns True
你需要理解 slug
在 Django 中的含义:
slug - Matches any slug string consisting of ASCII letters or numbers, plus the hyphen and underscore characters. https://docs.djangoproject.com/en/3.1/topics/http/urls/#example
因此它将接受符合这些要求的任何路径,并且 posts/
实际上符合这些要求。如果 Django 找到匹配项,它不会检查任何其他路由,因此它永远不会到达 path('posts/', views.PostsView.as_view(), name='posts')
,因为 '<slug:slug>/'
在较小的索引中比 'posts/'
具有更高的优先级。你可能会检查你的模型中不存在的那个 slug,所以它会 return 一个 404.
通过更改路线顺序,您将路线更改为 ["", "posts/", "<slug:slug>/"]
。现在 "posts/"
具有更高的优先级,django 将使用 PostsView
.