在django应用程序中保存静态文件的位置,如何从nginx从多个位置服务静态文件

时间:2014-09-24 13:38:15

标签: python django nginx

我是django应用程序,使用nginx提供静态文件。我想在项目中包含app(功能)。

我想过创建newapp并将文件放在静态文件夹下。 (但我需要更改nginx conf以提供来自这些dirs的文件)​​

project
 |
 |-templates
 |-static
    |
    |-js
    |-css


 newapp
 |
 |-static
    |
    |-js
    |-css
  1. 这是保留静态文件,模板的首选方式(在应用程序中?(我认为该应用程序下的测试更清晰))

  2. 如果我们想从两个位置提供静态文件如何更改nginx conf?

  3. 我目前的nginx conf就像

    location /static/ {  alias /myproject/location/static/; }
    
    1. 如果我们把所有过滤器放在那个主要项目(静态,模板)中,它会变得复杂吗?

    2. 有没有办法匹配

      alias / myproject / * / static

2 个答案:

答案 0 :(得分:2)

这正是我们拥有staticfiles app的原因。将每个应用程序的资产放在该应用程序中,然后在部署运行manage.py collectstatic上,它们将全部收集在/ static /

下的子目录中

答案 1 :(得分:2)

回答问题1:

将特定应用的静态文件放在应用的文件夹中,而不是项目的“静态”文件夹中。

/project/
    /polls/
        /static/
            /polls/
                foobar.css
                foobar.js
        /templates/
            /polls/
                vote.html
    /static/
        specific-to-the-project.js
    /templates/
        specific-to-the-project.html
        base.html

关键是你的应用程序文件夹中有一个static文件夹,并且其中有一个与你的应用程序同名的文件夹。

当您运行collectstatic时,它将收集在这些文件夹中找到的所有文件。

请注意,在引用文件时,您将执行类似...

的操作
{% load staticfiles %}
{% static 'app/foobar.css' %}

回答问题2:

当您运行collectstatic时,它会收集所有文件并将其复制到STATIC_ROOT设置指定的一个中心位置。

回答问题3:

不,因为您不使用STATIC_ROOT中的文件。您只处理原始位置的文件,然后在准备好后运行collectstatic

回答问题4:

你可以做一个sym链接..

实际上,这就是staticfiles应用程序的用途。我建议在此处进行调整并阅读:https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/

更新回答评论

最佳做法是/<project_root>/polls/static/polls/foobar.css而不是/<project_root>/polls/static/foobar.css。然后从您的模板通过{% static 'polls/foobar.css' %}而不是{% static 'foobar.css' %}访问foobar.css。请参阅下面的示例。

示例

在运行collectstatic之前

/<project_root>
    /polls
        views.py
        urls.py
        ...
        /templates
            vote.html
            ...
        /static
            /polls
                foobar.css
                foobar.js
    /otherapp
        views.py
        urls.py
        ...
        /templates
            hello.html
            ...
        /static
            foobar.css
            foobar.js
    /<static_root>
        (empty)

运行collectstatic

之后
/<project_root>
    /polls
        views.py
        urls.py
        ...
        /templates
            vote.html
            ...
        /static
            /polls
                foobar.css
                foobar.js
    /otherapp
        views.py
        urls.py
        ...
        /templates
            hello.html
            ...
        /static
            foobar.css
            foobar.js
    /<static_root>
        foobar.css
        foobar.js
        /polls
            foobar.css
            foobar.js

每个应用程序中静态文件夹的内容都将复制到STATIC_ROOT目录中。

通过将文件直接放在静态文件夹中,再添加一个目录并将其放入其中,可能会导致文件夹冲突。

当您处理开源项目并且不知道应用程序的安装位置时,这一点更为重要。但它也被认为是最佳实践:)(我花了一段时间来适应它,但没有回头。)

此外,只要在您的INSTALLED_APPS中列出'polls',您就不需要将'polls / static / polls'添加到STATICFILES_DIRS。