Django 将应直接在服务器根目录下提供服务的静态文件放在何处?

Django 将应直接在服务器根目录下提供服务的静态文件放在何处?,django,Django,我刚刚迁移了一个旧的Django项目来使用staticfiles应用程序。在此之前,我在一个名为static的目录中有所有需要的文件,该目录直接在服务器根目录下提供服务。这个目录现在是在静态URL下提供的,这很好,除了应该直接在服务器根目录下提供的文件 我知道如何直接从根目录(比如/favicon.ico或/robots.txt)提供文件,但我应该把它们放在哪里?如果我把它们放在STATIC_ROOT下面的任何地方,它们将由两个URL(例如/file.txt和/STATIC/foobar/fil

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

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


有什么想法吗?

让它们保持静止,让您的Web服务器重定向到
/static/favicon.ico
/favicon.ico

要更完整地回答:

如果您有文件
favicon.ico
,这是一个静态文件,因此应该存在于
static\u ROOT
中。但是,此文件是正常规则的例外,您不希望它存在于
/static/favicon.ico
,而是希望它存在于
/favicon.ico
。由于这是该规则的一个例外,因此您只需将此文件的特殊规则添加到您的Web服务器配置中,以便它也在
/favicon.ico
中提供服务

现在你有两个不同的URL为同一个资源服务,这是一件坏事。由于您特意添加了使文件在
/
上服务的规则,我们将假定这是规范url,并告诉Web服务器将
/static/favicon.ico
重定向到
/favicon.ico
。现在您有了相同的资源,从一个位置提供服务


/static/
根目录中的其他文件将不受此影响,因为在您为
favicon.ico
在Web服务器中设置的规则中,您指定了
favicon.ico
,因为此文件(以及您希望从
//code>提供服务的任何其他文件)具有异常性质。

我已经解决了这两个问题(favicon.ico,robots.txt)在url.py中,但存在一些差异。 我不喜欢一个人首先想到的解决方案是创建一个视图并执行一个render\u-to\u响应

编辑:从Django 1.5 direct_到_模板和重定向_到已弃用,因此现在您可以使用基于类的视图

对于Django 1.5

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

(r'^favicon\.ico$', redirect_to, 
{'url': settings.STATIC_URL + 'img/favicon.ico'}),
对于robots.txt,将以下行添加到URL模式:

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

(r'^robots\.txt$', TemplateView.as_view(template_name="robots.txt",
                                        content_type='text/plain')),
(r'^favicon\.ico$', RedirectView.as_view(
                            url=settings.STATIC_URL + 'img/favicon.ico')),
我使用通用类视图TemplateView,并指定要使用的模板(robots.txt,应该在模板目录中)和mimetype

对于favicon.ico,在urlpatterns中添加以下行:

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

(r'^robots\.txt$', TemplateView.as_view(template_name="robots.txt",
                                        content_type='text/plain')),
(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'}),

因此,重定向将在文件送达之前启动?在不需要解决方法的情况下,没有解决方案吗?我应该将需要直接进入静态根目录的文件放在哪里?我明白了-重定向到Canonical url似乎是唯一的方法。允许我将某些内容直接放入静态根目录吗?我的意思是-它不应该是空的吗e仅由
manage.py collectstatic
填写?通常我将我的
STATIC\u ROOT
设置为
PROJECT/site\u media/STATIC
。然后对于项目级静态文件,我将它们放在
PROJECT/STATIC
中,我的
STATICFILES\u DIRS
设置包括
PROJECT/STATIC
。谢谢你的回答。我仍然很高兴使用/(例如favicon.ico)下的文件,但基本上您的解决方案是尽可能接近的。一种更简单的方法是直接返回一个HttpResponse。即
url(r'^robots\.txt$,lambda r:HttpResponse(“用户代理:*\nDisallow:,mimetype=“text/plain”)),
谢谢。这种方法的唯一问题是,在生产环境中,静态文件由不同的服务器(如nginx)提供服务,这些异常由wsgi服务器(如uwsgi)提供服务这是次优的。可以通过向静态服务器配置添加规则来克服。对于nginx,这将是:
location/robots.txt{alias/webapps/mywebsite/templates/robots.txt;}