2011-10-11 69 views
1

在我的Django项目中,我为每个应用程序app1/static /,app2/static等设置了静态文件夹。它对开发服务器可以正常工作。Nginx和Django:如何跨越多个路径的位置

但是,当我切换到通过fastcgi使用Django开发服务器+ nginx。有一个问题,我只能将静态映射到一个位置。在Nginx中,是否可以将app1/static /,app2/static等映射到url/static。

以下配置似乎不起作用。什么是实现它的正确方法?由于

location ^~ /static/ { 
    root "app1/static/";app2/static; 
    } 

回答

3

您应该按照https://docs.djangoproject.com/en/dev/howto/static-files/

它说的是你从你的应用程序文件夹中的static/子文件夹中提供文件。在您的模板中,您使用{{ STATIC_URL }}或旧版本{% get_static_prefix %}。在开发服务器下的调试模式下,Django将直接处理应用程序文件夹中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>; 
} 
+0

谢谢。我已阅读过此链接。但用你的答案重新阅读对我来说更有意义。我终于明白了现在使用了什么STATIC_ROOT。 –

2

对不起,我不知道很多关于nginx的,但我不认为你需要做的,原因在于manage.py collectstatic命令会自动将您的所有静态文件到一个目录(STATIC_ROOT)为你。我希望这能解决你的问题。

+0

感谢您的回答。但是我想用自己的静态子文件夹来保持每个应用程序的独立性,因为这个项目只是为了学习的目的,所有的应用程序实际上都是互不相关的。 –

+0

您仍然可以使用静态文件:AppDirectoriesFinder从每个应用程序的静态目录中收集文件(https://docs.djangoproject.com/en/1.3/ref/contrib/staticfiles/#staticfiles-finders)。 – arie

+0

是的,我正在使用开发服务器。但使用Nginx时会出现问题:无法访问app2的静态文件。请在问题中查看我的更新。 –

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。它将所有应用程序静态文件夹同步到一个用于托管的集中文件夹。

+0

上面的答案告诉我,collectstatic是最好的选择。尽管我只能接受一个答案,但我确实已经从所有人那里学到了东西。谢谢。 –