Django,urls.py,include似乎不起作用

2 投票
6 回答
24582 浏览
提问于 2025-04-17 04:07

我想在我的主urls.py文件里加入一个额外的urls.py,但似乎没有成功。我查了很多资料,还是搞不明白。

这是我的主urls.py文件,管理员部分运行得很好:

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

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
        (r'^pnasser/',include('pnasser.urls')),
        (r'^admin/',include(admin.site.urls)),
        (r'^',include('pnasser.urls')),
)

然后我有一个名为pnasser的文件夹,里面有一个urls.py文件,内容如下:

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

urlpatterns = patterns('pnasser.views',
        (r'^$','index'),
        (r'^login/$','login'),
        (r'^signup/$','signup'),
        (r'^insertaccount/$','insertaccount'),
        (r'^home/$','home'),
        (r'^update/(?P<accid>\d+)','update'),
        (r'^history/(?P<accid>\d+)','account_history'),
        (r'^logout/(?P<accid>\d+)','logout'),

)

我不确定是不是在配置上漏掉了什么。如果我访问mysite.com/admin,管理员页面能正常加载,但如果我访问mysite或其他视图的URL,就会出现404页面找不到的错误:

使用在mysite.urls中定义的URL配置,Django尝试了这些URL模式,顺序如下: 1. ^pnasser/ 2. ^admin/

当前的URL没有匹配到任何一个。

编辑 settings.py中的已安装应用:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    #'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
     'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
        'pnasser',

)

更新2

所以,我还尝试通过开发服务器运行我的网站:python manage.py runserver 0.0.0.0:8000,这个可以正常工作。我猜测可能是在我用apache和mod_wsgi集成时出现了问题,但我不确定问题出在哪里。

6 个回答

1
from django.contrib import admin,include
admin.autodiscover()

urlpatterns = patterns('',
        (r'^pnasser/',include('pnasser.urls')),
        (r'^admin/',include(admin.site.urls)),
        (r'^',include('pnasser.urls')),
)

可能你在第一行漏掉了“include”这个词。

1

问题在于你使用了一个空的正则表达式("^"会匹配任何东西,包括空的URL)来处理包含指令。如果这样做的话,它会在你的请求路径前面总是加一个斜杠。考虑到你的pnasser.urls中没有针对"/"的正则表达式,所以在mysite.com的请求就没有匹配项。

如果你希望mysite.com或mysite.com/能够直接访问pnasser的“首页”,你需要设置类似这样的内容:

from django.contrib import admin

from pnasser.views import index

admin.autodiscover()


urlpatterns = patterns('',
    (r'^/?$', index),
    (r'^pnasser/',include('pnasser.urls')),
    (r'^admin/',include(admin.site.urls)),
)

所以,你有:

  • mysite.com => pnasser.views.index
  • mysite.com/ => pnasser.views.index
  • mysite.com/admin => 管理页面
  • mysite.com/pnasser/ => pnasser.views.index
  • mysite.com/pnasser/home => pnasser.views.home

如果这样还是不行,确保你已经安装了Django的CommonMiddleware,并且要确保你有APPEND_SLASH = True(这是默认设置,所以如果在你的settings.py文件中没有找到这个,你一般不需要去改动它)。

3

问题似乎出在django.wsgi文件上,主要是标准的django.wsgi文件加载Python网站的方式和开发服务器加载网站的方式之间的差异。我想这是一个大家都知道的问题,但我之前并不知道。感谢大家的建议。

这里有一个替代的django.wsgi文件:http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

撰写回答