【问题标题】:Django "homepage" app urls.py issueDjango“主页”应用程序urls.py问题
【发布时间】:2014-07-08 18:36:50
【问题描述】:

我对 Django 很陌生,当我布置我的网站时,我是按以下方式进行的:

该项目是某种“门户”,

  • App 1“home”是包含主页、登录、注册的应用程序 和其他“全站”功能
  • App 2“库存”是基本资产库存
  • App 3“仪表板”是一组基于库存中资产的状态仪表板

现在我正在尝试添加登录功能,并且我有一个主项目 urls.py,如下所示:

文件:/portal/urls.py

from django.conf import settings
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^$', include('home.urls'), name='home'),
    url(r'^admin/', include(admin.site.urls), name='admin'),
    url(r'^inventory/', include('inventory.urls'), name='inventory'),
    url(r'^dashboard/', include('dashboard.urls'), name='dashboard'),
    url(r'^capacity/', include('capacity.urls'), name='capacity'),
)

我的计划是使用 .../home/urls.py 来管理任何站点范围的功能,例如登录、注册等。

现在主页索引视图显示得很好,但是 .../home/urls.py 中的任何其他内容都会给我一个 404

文件:/home/urls.py

from django.conf.urls import patterns, url
from home import views

urlpatterns = patterns('',
    url(r'^test/$', views.index, name='home_test'),
    url(r'^ajax_login/$', views.ajax_login, name='ajax_login'),
    url(r'^$', views.index, name='home_index'),
)

在这一点上,我想我的问题有两个:我是否正确地处理了这个问题?如果是这样,我怎样才能获得所需的功能?如果没有,我应该如何改变设置/布局的方式以正确的“最佳实践”方式?

提前致谢!

编辑

感谢 dt0xff 和 Holdenweb,它可以正常工作,接受了 Holdenweb 的回答,因为它更准确,包括需要将主页 url 包含在其余部分下方。

这是我的新门户/urls.py 文件供参考

文件:/portal/urls.py

from django.conf import settings
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls), name='admin'),
    url(r'^inventory/', include('inventory.urls'), name='inventory'),
    url(r'^dashboard/', include('dashboard.urls'), name='dashboard'),
    url(r'^capacity/', include('capacity.urls'), name='capacity'),
    url(r'^', include('home.urls'), name='home'),
)

【问题讨论】:

    标签: python django


    【解决方案1】:

    问题在于您的第一个模式,它只匹配空 URL。因此,任何空 URL 都会导致 home/urls.py URL 被分析,但即使在其中也只有空 URL 会匹配。

    不幸的是,如果没有公共前缀,那么该模式 "^" 将匹配每个 URL(因为它们都从开头开始......)。

    因此,您应该为所有页面使用公共前缀,或者将主页 URL 规范放在末尾,以便在测试之前让其他 URL 有机会匹配。

    【讨论】:

      【解决方案2】:

      Django 在 url 中看起来像这样:

      1. 获取根 url 列表 - 门户/url
      2. 先查找,与当前 url 匹配
      3. 如果是include,则转到包含的url,切断匹配部分

      你的问题来了

      url(r'^$', include('home.urls'), name='home'),
      

      我是说,这里

      '^$'
      

      您希望 url 匹配“url 的开头和结尾”。它适用于 root(dunno.com/),但不适用于其他人,因为 url 将包含更多内容......

      所以,只需删除 $ 就可以了

      url(r'^', include('home.urls'), name='home'),
      

      【讨论】:

      • 虽然因为即使是空字符串也有一个开头,这个模式将匹配所有的字符串。因此,顶级列表中的任何其他 URL 都没有机会匹配,因此我建议重新排序列表。
      【解决方案3】:

      你永远不需要在 project/urls.py 中添加 regex($)

      【讨论】:

      • 请在您的答案中添加解释。
      猜你喜欢
      • 2016-12-04
      • 2016-08-04
      • 2012-04-25
      • 2012-01-26
      • 2015-05-02
      • 1970-01-01
      • 2012-01-31
      • 2014-05-21
      • 1970-01-01
      相关资源
      最近更新 更多