从Django开发服务器根目录提供静态文件
我的目标是让一个Angular项目从我的开发服务器的根目录提供服务。对于Django来说,这些文件都是完全静态的,不需要进行Django模板处理。这个Angular项目会向同一个开发服务器上的/api/路径请求资源,而Django项目会返回从视图生成的json结果,供Angular项目处理。
我以为只需要在我的urls.py文件中添加以下内容就可以了。
url(r'^/', 'django.views.static.serve', {
'document_root':'/Users/kyle/Development/project/site/app',
}),
或者
+ static("^/$", document_root="/Users/kyle/Development/project/site/app")
把它加到urlpatterns的末尾。
这里的/project/site/app是存放Angularjs文件的目录。
然而,这两种方法都让我遇到了404错误。
如果有更明显的解决方案,我愿意改变项目的结构。
3 个回答
4
结果发现,这个问题是由两件事造成的。正如shavenwarthog所说,路径中不应该有斜杠。此外,还需要一个正则表达式来指向文件。最后的代码变成了:
url(r'^(?P<path>.*)$', 'django.views.static.serve', {
'document_root':'/Users/kyle/Development/project/site/app',
}),
这样我就可以访问像这样的文件:
http://localhost/beer.jpg
6
你需要在根目录(/)同时提供index.html和你的静态文件,这在Django 1.10中可以这样做:
from django.contrib.staticfiles.views import serve
from django.views.generic import RedirectView
urlpatterns = [
# / routes to index.html
url(r'^$', serve,
kwargs={'path': 'index.html'}),
# static files (*.css, *.js, *.jpg etc.) served on /
url(r'^(?!/static/.*)(?P<path>.*\..*)$',
RedirectView.as_view(url='/static/%(path)s')),
]
可以查看这个回答,我在里面写了更详细的配置说明,特别是如果你想把它用在生产环境中。
1
要注意,Django 默认情况下不会显示目录列表。如果文件
/Users/kyle/Development/project/site/app/beer.jpg
没有在http://localhost/beer.jpg
显示出来,你还是会看到404错误吗?在
urls.py
文件中,URL 不应该以斜杠开头;你可以对比一下url(r'beer')
和url(r'^/beer')
的区别。
我建议你使用标准的 STATIC 支持。这虽然有点麻烦,但可以让你在开发时简单地提供文件服务,等到上线时再切换到第三方服务器(比如 Nginx):