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