Где разместить статические файлы, которые должны обслуживаться непосредственно под корнем сервера? - PullRequest
2 голосов
/ 04 июля 2011

Я только что перенес старый проект Django, чтобы использовать приложение staticfiles.До этого у меня были все необходимые файлы в директории с именем static, которые доставлялись прямо под корень сервера.Этот каталог теперь обслуживается в STATIC_URL, что хорошо, за исключением файлов, которые должны обслуживаться непосредственно под корнем сервера.

Я знаю, как обслуживать файлы непосредственно из корня (например, /favicon.ico или / robots.TXT) но где я должен положить их?Если я помещу их где-нибудь ниже STATIC_ROOT, они будут обслуживаться двумя URL-адресами (например, /file.txt и /static/foobar/file.txt), что не является хорошей практикой.

Есть идеи?

Ответы [ 2 ]

10 голосов
/ 14 апреля 2012

Я решил обе проблемы (favicon.ico, robots.txt) в url.py, но с некоторыми отличиями. Мне не нравится решение, которое, во-первых, можно подумать, чтобы сделать представление выполнением 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 голос
/ 04 июля 2011

Держите их в статическом состоянии, и ваш веб-сервер перенаправляет /static/favicon.ico на /favicon.ico.

Чтобы ответить более полно:

Если у вас есть файл favicon.ico, это статическоефайл и как таковой должен существовать внутри STATIC_ROOT.Однако этот файл является исключением из обычного правила, и вы не хотите, чтобы он существовал в /static/favicon.ico, вы хотите, чтобы он существовал в /favicon.ico.Поскольку это исключение из правила, вы добавляете специальное правило только для этого файла в конфигурацию вашего веб-сервера, чтобы оно также обслуживалось на /favicon.ico.

Теперь у вас есть один и тот же ресурс, обслуживаемый двумя разнымиURL-адреса, что плохо.Поскольку вы старались изо всех сил добавить правило, чтобы ваш файл обслуживался на /, мы предположим, что это канонический URL-адрес, и скажем веб-серверу перенаправить /static/favicon.ico на /favicon.ico.Теперь у вас есть тот же ресурс, обслуживаемый из одного места.

Другие файлы в корне /static/ не будут затронуты этим, потому что в правилах, которые вы установили на веб-сервере для favicon.ico, вы указалиfavicon.ico из-за исключительной природы этого файла (и любого другого файла, который вы хотите передать из /).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...