Django,urls.py,include似乎不起作用
我想在我的主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 个回答
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”这个词。
问题在于你使用了一个空的正则表达式("^"
会匹配任何东西,包括空的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文件中没有找到这个,你一般不需要去改动它)。
问题似乎出在django.wsgi文件上,主要是标准的django.wsgi文件加载Python网站的方式和开发服务器加载网站的方式之间的差异。我想这是一个大家都知道的问题,但我之前并不知道。感谢大家的建议。
这里有一个替代的django.wsgi文件:http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html