Django URL排序

时间:2014-09-05 18:52:45

标签: python django

我尝试使用Django站点地图框架来设置站点地图,但我在设置站点地图网址时遇到了问题。

这是我的项目urls.py

from django.contrib.sitemaps.views import sitemap

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = patterns('',
        url(r'^debug-toolbar/', include(debug_toolbar.urls)),
    )

    urlpatterns += patterns('',
        url(r'^admin/', include(admin.site.urls)),
        url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}),
        url(r'^robots\.txt$', TemplateView.as_view(template_name="robots.txt")),
        url(r'^500/$', TemplateView.as_view(template_name="500.html")),
        url(r'^404/$', TemplateView.as_view(template_name="404.html")),
        url(r'^', include('hunt.urls')),
    )
else:
    urlpatterns = patterns('',
        url(r'^admin/', include(admin.site.urls)),
        url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}),
        url(r'^robots\.txt$', TemplateView.as_view(template_name="robots.txt")),
        url(r'^500/$', TemplateView.as_view(template_name="500.html")),
        url(r'^404/$', TemplateView.as_view(template_name="404.html")),
        url(r'^', include('hunt.urls')),
    )

这是我的搜索应用urls.py

urlpatterns = patterns('hunt.views',
    url(r'^$', top100, name='top100'),
    url(r'^explore/$', explore, name='explore'),
    url(r'^monthly/$', monthlytop10, name='monthlytop10'),
    url(r'^trending/$', trending, name='trending'),
    url(r'^genres/$', genres, name='genres'),
    url(r'^genres/(?P<slug>.+)/$', genre_view, name='genre_view'),
    url(r'^contact/$', contact, name='contact'),
    url(r'^contact/thanks/$', thanks, name='thanks'),
    url(r'^faq/$', faq, name='faq'),
    url(r'^songs/(?P<slug>.+)$', song_search, name='song_search'),
    url(r'^loadmore/dj/$', loadmore_dj, name='loadmore_dj'),
    url(r'^loadmore/genre/$', loadmore_genre, name='loadmore_genre'),
    url(r'^loadmore/month/$', loadmore_month, name='loadmore_month'),
    url(r'^loadmore/trending/$', loadmore_trending, name='loadmore_trending'),
    url(r'^vote/dj/$', vote_dj, name='vote_dj'),
    url(r'^vote/genre/$', vote_genre, name='vote_genre'),
    url(r'^vote/month/$', vote_month, name='vote_month'),
    url(r'^vote/trending/$', vote_trending, name='vote_trending'),
    url(r'^(?P<slug>.+)/$', dj, name='dj'),
)

urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

当我尝试访问sitemap.xml时,我收到错误

404 Page Not Found
No DJ matches the given query.

这意味着它尝试访问我的寻线应用中的最后一个网址。为什么它会尝试访问DJ页面,即使它位于sitemap.xml URL之后?

编辑 - 根据伊兰的建议,我运行了show_urls的{​​{1}}命令。这是

的输出
django_extensions

3 个答案:

答案 0 :(得分:1)

根据show_urls输出,hunt.views.dj的网址模式优先,因为r'^(?P<slug>.+)/$'正则表达式出现在sitemap.xml正则表达式之前。前正则表达式将匹配对#34; sitemap.xml&#34;的请求,因此Django将永远不会达到特定用于sitemap.xml的模式。就此而言,它永远不会达到/ contact /,/ explore /,/ faq /等。

我怀疑这种情况正在发生,因为您的项目范围urls.py附加到urlpatterns(&#34; urlpatterns +=&#34;)而不是直接设置它。您似乎没有粘贴项目范围urls.py中的所有导入,但我认为您导入的其中一项内容包括patterns个对象;否则您在导入时(NameError)获得name 'patterns' is not defined

您应该可以通过更改此内容来修复它...

urlpatterns += patterns('',

......对此...

urlpatterns = patterns('',

但我无法确定,因为我不知道你在项目urls.py中输入了什么。

答案 1 :(得分:0)

我注意到您的站点地图和robots.txt网址是唯一不以尾部斜杠结尾的网址。许多Web服务器会将myurl.com/item重定向到myurl.com/item/ - 例如,这是preferred practice when using Apache(搜索“Trailing Slash Problem”)。尝试在没有尾部斜线的情况下对网址进行卷曲 - 您是否获得301重定向?如果是这样,那么很可能重定向到包含尾部斜杠的URL,该斜杠与urls.py中的模式不匹配。尝试在正则表达式中添加尾部斜杠,或在settings.py

中设置APPEND_SLASH = True

答案 2 :(得分:0)

我之前使用的模板文件夹中有一个sitemaps.xml文件。删除解决了这个问题。