在哪里放置应该直接在服务器根目录下提供的静态文件?

时间:2011-07-04 17:49:09

标签: django

我刚刚迁移了一个旧的Django项目来使用staticfiles应用程序。在此之前,我将所有需要的文件放在名为static的目录中,该目录直接在服务器根目录下提供。此目录现在在STATIC_URL下提供,除了应该直接在服务器根目录下提供的文件外,这个目录很好。

我知道如何直接从root提供文件(例如/favicon.ico或/robots.txt),但我应该把它放在哪里?如果我把它们放在STATIC_ROOT下面的任何地方,它们将由两个URL(例如/file.txt和/static/foobar/file.txt)提供服务,这不是一个好习惯。

有什么想法吗?

2 个答案:

答案 0 :(得分:10)

我已经解决了url.py中的两个问题(favicon.ico,robots.txt)但有一些差异。 我不喜欢首先考虑使视图执行render_to_response的解决方案。

编辑:来自Django 1.5的direct_to_template和redirect_to已被弃用,所以现在您可以使用基于类的视图。

对于Django 1.5

对于robots.txt,请将以下行添加到您的urlpatterns:

from django.views.generic.base import RedirectView, TemplateView

(r'^robots\.txt$', TemplateView.as_view(template_name="robots.txt",
                                        content_type='text/plain')),

我使用泛型类视图TemplateView,并指定要使用的模板(应该在模板目录中的robots.txt)和mimetype。

对于favicon.ico,将以下行添加到您的urlpatterns:

(r'^favicon\.ico$', RedirectView.as_view(
                            url=settings.STATIC_URL + 'img/favicon.ico')),

将/favicon.ico重定向到STATIC_URL + img / favicon.ico(例如:/static/img/favicon.ico) favicon.ico应位于您的静态目录中。

这些方法可用于任何媒体或HTML内容。

对于以前版本的Django,您可以使用

(r'^robots\.txt$', direct_to_template, {'template': 'robots.txt',
'mimetype': 'text/plain'}),

(r'^favicon\.ico$', redirect_to, 
{'url': settings.STATIC_URL + 'img/favicon.ico'}),

答案 1 :(得分:1)

将它们保持静态,并让您的网络服务器将/static/favicon.ico重定向到/favicon.ico

更全面地回答:

如果你有文件favicon.ico,这是一个静态文件,因此应该存在于STATIC_ROOT内。但是,此文件是普通规则的一个例外,您不希望它存在于/static/favicon.ico,您希望它存在于/favicon.ico。由于这是规则的一个例外,因此您只需将此文件的特殊规则添加到您的网络服务器配置中,以便在/favicon.ico处提供该文件。

现在你拥有2个不同网址所提供的相同资源,这是一件坏事。由于您不遗余力地添加规则以使文件在/投放,我们将假设这是规范网址,并告知网络服务器将/static/favicon.ico重定向到/favicon.ico 。现在您拥有相同的资源,从一个位置提供服务。

/static/根目录中的其他文件不受此影响,因为在favicon.ico的网络服务器中设置的规则中,您指定了favicon.ico,因为它具有特殊的性质此文件(以及您要从/提供的任何其他文件)。