Использование внешних URL-адресов в TEMPLATE_DIRS Джанго - PullRequest
8 голосов
/ 20 ноября 2011

TEMPLATE_DIRS в Django в Settings.py вызывает косые черты в стиле Unix.

Из-за этого, когда я вызываю

get_template('some/template.html')

в виде, результат всегда начинается с корняприводит к вызову

/home/username/projectname/public/some/template.html

Проблема в том, что я хотел бы использовать шаблоны, размещенные на совершенно другом сайте.Это прекрасно работает для других полей Settings.py (MEDIA_URL и STATIC_URL), где он будет принимать абсолютный путь http без возражений.

При заданном пути http

 TEMPLATE_DIRS ('http://example.com/',)

в настройках.py заставит

get_template('some/template.html')

, чтобы попытаться найти

/home/username/projectname/public/http://example.com/some/template.html

Я пытался обойти это так

TEMPLATE_DIRS ('../../../../http://example.com/',)

Но это все равно заставляетначальная косая черта, поэтому я получаю "/ http://example.com",, что бесполезно.

Мои вопросы:

  1. Есть ли способ обмануть это при получении файлов шаблонов с другого сервера?
  2. Возможно ли это, учитывая, что файлы шаблона необходимо обработать для представления?
  3. Можно ли создать альтернативу django.template.loaders.filesystem.Loader, которая не вызывает unixкосые черты?

Ответы [ 3 ]

5 голосов
/ 20 ноября 2011

Вам не нужно использовать каталог шаблонов, если вы этого не хотите.Если у вас есть сервер, который обслуживает файлы шаблонов, вы можете просто извлечь их удаленно, используя urllib2, а затем вручную создать и отобразить шаблон с контекстом:

import urllib2
from django.template import Context, Template

tpl_html = urllib2.urlopen("http://mysite.com")
tpl = Template(tpl_html)
return tpl.render(Context({
    'some_variable' : 'some_val',
})

необходимо включить некоторое кэширование, так как для каждого запроса на использование этого шаблона вам нужно сделать внешний запрос.В качестве альтернативы вы можете записать это в пользовательский загрузчик, но он будет иметь те же ограничения.

3 голосов
/ 20 ноября 2011

Вы не можете сделать это.

Это не имеет ничего общего с путевыми именами.Просто загрузчик шаблонов файловой системы должен загружать вещи из файловой системы, отсюда и имя.

Это полностью отличается от случая MEDIA_URL: он просто добавляет путь в ваш HTML, который затем загружает ваш браузер.Django не волнует, где находится этот файл: хотя на самом деле применяется обратное, если вы передадите ему путь к файлу, который не является URL-адресом (то есть обслуживается веб-сервером где-то), он просто не будет работать.

Теперь вы можете написать загрузчик шаблонов, который получает свои шаблоны с другого сервера.Загрузчики шаблонов являются подключаемыми - вам просто нужно указать имя нового загрузчика в настройке TEMPLATE_LOADERS.Сам загрузчик должен использовать что-то вроде urllib.urlopen для получения шаблона с внешнего сервера.

Но прежде чем сделать это, подумайте очень внимательно.Это означает, что каждый шаблонный запрос теперь требует вызова на внешний сервер, прежде чем вы сможете обслуживать страницу.В типичном случае шаблона, который расширяет другие шаблоны и включает вызовы во включенные теги шаблона, это может быть пять или десять вызовов.И, в отличие от медиа-файлов, это не может быть сделано параллельно: страница просто не будет обслуживаться, пока весь процесс не будет завершен.Это может сделать ваш веб-сервер очень медленным.

Я не знаю, почему вы думаете, что вам нужно это сделать.Шаблоны являются частью кода вашего приложения, поэтому они обычно находятся на том же сервере, что и ваш код Python.Если у вас действительно есть какая-то причина хранить их внешне, одним из решений может быть монтирование внешней файловой системы на ваш веб-сервер через что-то вроде sshfs .Это все еще, вероятно, будет очень медленным, хотя.Подумай еще раз.

0 голосов
/ 20 ноября 2011
  1. Нет - его невозможно обмануть, извлекая файлы с другого сервера через http
  2. Да - вы, безусловно, могли бы создать подкласс django.template.loaders.filesystem.Loader (и соответствующим образом изменив метод load_template_source), чтобы вы могли загружать шаблоны через http

После того, как вы выполнили 3, ответ на 2 будет положительным - это будет возможно - в конечном счете, язык шаблонов Django не заботится о том, откуда он получает файл, если он находится в правильном формате.

Тем не менее, это выглядит как очень неэффективный способ загрузки шаблонов, и, скорее всего, есть гораздо лучший способ достижения того же результата.

...