从Django开发服务器根目录提供静态文件

7 投票
3 回答
5217 浏览
提问于 2025-04-18 07:58

我的目标是让一个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
  1. 要注意,Django 默认情况下不会显示目录列表。如果文件 /Users/kyle/Development/project/site/app/beer.jpg 没有在 http://localhost/beer.jpg 显示出来,你还是会看到404错误吗?

  2. urls.py 文件中,URL 不应该以斜杠开头;你可以对比一下 url(r'beer')url(r'^/beer') 的区别。

我建议你使用标准的 STATIC 支持。这虽然有点麻烦,但可以让你在开发时简单地提供文件服务,等到上线时再切换到第三方服务器(比如 Nginx):

https://docs.djangoproject.com/en/dev/howto/static-files/

撰写回答