Django urls.py bug - 一些模式不起作用

Luk*_*tka 1 python django web

在Django开发个人博客时,我在代码中遇到了一个令人讨厌的错误.基本上,我已经通过添加一些规则来更改我的urls.py文件,以使某些视图可访问.

urls.py

from django.conf.urls import include, url
from django.contrib import admin

from blog import views


urlpatterns = [
    # Examples:
    # url(r'^$', 'blogas.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', views.index, name='index'),
    url(r'^(?P<slug>\w+)', views.view_post, name='view_blog_post'),
    url(r'^about/$', views.about, name='about'),
    url(r'^posts/$', views.posts, name='posts'),

]
Run Code Online (Sandbox Code Playgroud)

一切似乎都在工作,除非我尝试访问http://127.0.0.1:8000/或/ post,Django抛出404错误.这是什么原因?我已经定义了两个规则,但系统似乎没有认识到这种模式 - 也许我错了一些东西?也许我对url格式一无所知(可能是,这是我第一次做这些事情)?

非常感谢新手程序员给每个发现错误的人:)

Dan*_*iel 5

网址模式从上到下进行处理.你的第三个模式^(?P<slug>\w+)消耗了一切,所以aboutposts从未达到.

一个例子:Django想要找到url的视图about/.模式^admin/^$不匹配.但是^(?P<slug>\w+),因为about以字母或数字开头(包含在其中的字符集\w)

>>> import re
>>> re.search('^(?P<slug>\w+)', 'about/')
<_sre.SRE_Match object at 0x10b5b7be8>
Run Code Online (Sandbox Code Playgroud)

所以Django找到了一个匹配,callBs views.view_post并完成了请求.这意味着,必须首先采用更具体的规则.更好:避免歧义.