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

时间:2014-05-17 21:40:48

标签: 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'),

]

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

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

2 个答案:

答案 0 :(得分:5)

url-patterns从上到下进行处理。您的第三种模式^(?P<slug>\w+)会消耗所有内容,因此永远无法访问aboutposts

示例:Django想要找到网址about/的视图。模式^admin/^$不匹配。但是^(?P<slug>\w+)会这样做,因为about以字母或数字开头(\w中包含的字符集)

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

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

答案 1 :(得分:2)

您必须更改url(r'^(?P<slug>\w+)', views.view_post, name='view_blog_post'),的位置。

 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'^about/$', views.about, name='about'),
        url(r'^posts/$', views.posts, name='posts'),
        url(r'^(?P<slug>\w+)', views.view_post, name='view_blog_post'),
        ]

urlpatterns是列表,网址顺序很重要。