在我的Django项目中,我为每个应用程序提供了静态文件夹,app1 / static /,app2 / static等。它可以与开发服务器一起使用。
但是当我通过fastcgi切换到使用Django开发服务器+ nginx时。有一个问题,我只能映射/静态到一个位置。在Nginx中,是否有可能将app1 / static /,app2 / static等映射到url / static。
以下配置似乎不起作用。实现它的正确方法是什么?感谢
location ^~ /static/ {
root "app1/static/";app2/static;
}
答案 0 :(得分:3)
您应该关注https://docs.djangoproject.com/en/dev/howto/static-files/。
它说的是您从app-folders中的static/
个子文件夹提供文件。在您的模板中,您使用{{ STATIC_URL }}
或旧版{% get_static_prefix %}
。在开发服务器下的调试模式下,Django将直接提供app-folders中static
个子文件夹中的文件。
当你切换到nginx时,你会像Aviral建议的那样运行collectstatic
。这会将static/
子文件夹中的所有文件收集到STATIC_ROOT
文件夹中。为了不将所有文件都放在一个文件夹中,我建议您在应用中使用static/app-name
个文件夹。在这种情况下,STATIC_ROOT
将填充不同的app-name
子文件夹,并且每个应用的静态文件都是分开的。模板必须引用{{ STATIC_URL }}/app-name/my_static_image.jpg
等文件。
你的nginx配置应该只是看起来像:
location ^~ /static {
root <your STATIC_ROOT path>;
}
答案 1 :(得分:2)
抱歉,我对nginx了解不多,但我认为你不需要这样做,原因是manage.py collectstatic
命令会自动将所有静态文件复制到一个目录(STATIC_ROOT)中您。我希望这能解决你的问题。
答案 2 :(得分:0)
刚在测试服务器上试过这个 -
test directory structure
/home
/username
/static_test1
test1.txt
style.css
/static_test2
test2.txt
style.css
#nginx.conf
server {
server_name example.com;
location / {
root /home/username;
try_files /static_test1$uri /static_test2$uri =404;
}
}
如果我去example.com/test1.txt,我会得到test1.txt的内容,它也适用于test2。但它没有任何类型的自动索引页面,如果你没有调用正确的文件,你会得到一个Nginx 404.
我不知道这是否是生产中最好的事情。
归功于this serverfault question,我只是测试了它以确保它有效。
我主要担心的是: 具有相同名称的文件。他们从第一个列出的目录中撤出。
如果您与跨应用程序/项目的文件一致,这可能是一个巨大的问题。例如,style.css将从static_test1
中提取您真的可能想要考虑托管静态文件的方式。正如其他人所说。从v1.3开始,Django的静态文件处理完全符合您在一个命令中所需要的 - manage.py collectstatic
。它将您的所有应用程序静态文件夹同步到一个集中文件夹进行托管。