【问题标题】:URLpattern match doesn't work as expectedURLpattern 匹配没有按预期工作
【发布时间】:2018-12-30 03:27:37
【问题描述】:

我想要什么

我正在运行Django Project tutorial 的最初步骤,但已经有一些我无法解决的问题。

include() 背后的想法是让即插即用 URL 变得容易。由于投票在它们自己的 URLconf (polls/urls.py) 中,它们可以放在“/polls/”下,或“/fun_polls/”下,或“/content/polls/”下,或任何其他路径根目录下,并且该应用仍然可以运行。

我根据需要构建了所有内容,并且我的“架子”服务器工作正常(在此处调试,在 localhost 上运行)。 我在shelf.urls中设置urlpatterns,其中第一个尝试包含'bluebook.urls'。

from django.contrib import admin
from django.urls import include, path

 urlpatterns = [
    path('bluebook/', include('bluebook.urls')),
    path('admin/', admin.site.urls),
]

当我转到http://127.0.0.1:8000/bluebook/ 时,工作正常并加载了我设置的views.index。

什么不起作用

当我转到 http://127.0.0.1:8000/thebluebook/ 时,它会抛出 404。它会定义正则表达式匹配不起作用

Using the URLconf defined in shelves.urls, Django tried these URL patterns, in this order:
    1. bluebook/
    2. admin/
The current path, thebluebook/, didn't match any of these.

http://127.0.0.1:8000/the_bluebook/http://127.0.0.1:8000/go/bluebook/ 也是如此。

我尝试了什么

我没有写太多代码,所以没有太多可以加入到这个总结中。虽然错误消息只提到了shelf.urls,但我检查了bluebook.urls 是否设置为在从shelf.urls 重定向后接受任何正则表达式:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

我检查了Django Tutorial Part 1 Error: URL does not match URL patterns 并试图将 ROOT_URLCONF 从 'shelves.urls' 更改为 'urls',但它会抛出 ERR_CONNECTION_REFUSED 而不是 404,无论我在http://127.0.0.1:8000/ 之后放置什么,基本上该站点不再工作了.

我检查了Page not found 404 on Django site?,但我网站的 urls.py 位于 子文件夹 mysite/,而不是父 mysite/。

我也试过

urlpatterns = [
    path('bluebook/', 'bluebook.urls'),
    path('admin/', admin.site.urls),
]

但它也不起作用。

基本上,我的所有设置对我来说都是正确的,因为调用确切的 URLpattern 可以按预期工作。只有正则表达式匹配似乎不起作用。

FWIW,我正在使用 JetBrain 的 PyCharm 来编辑代码并设置 venv,没有插件,但我认为它不会影响 Django 代码的运行。

Python 版本: Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32

Django 版本: 2.0.7

PyCharm 版本: 2018.1.4

Chrome 版本: 版本 67.0.3396.99(官方构建)(64 位)

【问题讨论】:

  • 您为什么希望它与任何以 bluebook 结尾的模式匹配?

标签: django


【解决方案1】:

您的网址中没有包含“thebluebook”。你有path('bluebook/', include('bluebook.urls')),path('', views.index, name='index'), 这意味着你可以http://127.0.0.1:8000/bluebook/any/thing/here/,但你不能http://127.0.0.1:8000/any/thing/here/bluebook/

【讨论】:

  • 我误解了教程中的解释:“路由是一个包含 URL 模式的字符串。在处理请求时,Django 从 urlpatterns 中的第一个模式开始,并沿着列表向下移动,比较针对每个模式请求的 URL,直到找到匹配的 URL。”因为对我来说,theblueblook/ 匹配 'bluebook/',因为它包含它。它只是不匹配r'^bluebook/'。我要找的是r'.*bluebook/',但这需要re_path()
  • 太棒了,我很高兴你明白了。
猜你喜欢
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 2023-04-05
  • 1970-01-01
  • 2021-10-19
相关资源
最近更新 更多