Как использовать шаблоны Django без остальной части Django?

87

Я хочу использовать механизм шаблонов Django в моем (Python) коде, но я не создаю сайт на основе Django. Как его использовать без файла settings.py(и других) и необходимости устанавливать переменную среды DJANGO_SETTINGS_MODULE?

Если я запустил следующий код:

>>> import django.template
>>> from django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')

Я получаю:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
Теги:
templates
django-templates
template-engine

13 ответов

130
Лучший ответ

Решение прост. Фактически хорошо документировано, но не так просто найти. (Мне пришлось копаться - это не получилось, когда я попробовал несколько разных поисков Google.)

Работает следующий код:

>>> from django.template import Template, Context
>>> from django.conf import settings
>>> settings.configure()
>>> t = Template('My name is {{ my_name }}.')
>>> c = Context({'my_name': 'Daryl Spitzer'})
>>> t.render(c)
u'My name is Daryl Spitzer.'

См. документацию Django (см. выше) для описания некоторых параметров, которые вы можете определить (в качестве аргументов ключевого слова для настройки).

  • 13
    И чтобы получить его из файла: settings.configure (TEMPLATE_DIRS = (".",)) T = get_template ('test.html')
  • 0
    Документация для settings.configure () находится здесь - docs.djangoproject.com/en/1.7/topics/settings
Показать ещё 4 комментария
38
  • 4
    Я использую Jinja в моем проекте, потому что я хотел что-то, с чем я был довольно знаком, но не хотел, чтобы мои пользователи (так как это распространяемое приложение) должны были установить Django. Плюсом является то, что Jinja может быть установлен с easy_install.
  • 4
    Django также можно установить с помощью easy_install.
Показать ещё 1 комментарий
9

Любая конкретная причина, по которой вы хотите использовать шаблоны Django? Оба Jinja и Genshi находятся в моем мнение, высшее.


Если вы действительно этого хотите, см. документацию Django на settings.py. Особенно раздел "Использование настроек без настройки DJANGO_SETTINGS_MODULE". Используйте что-то вроде этого:

from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
7

Я бы также рекомендовал jinja2. В django vs. jinja2 есть хорошая статья, в которой содержится подробная информация о том, почему вы должны предпочесть более позднюю версию.

  • 0
    Я предпочитаю Jinja2 из-за синтаксиса {% set %} и равенства с механизмом шаблонов Twig (PHP). Лучше всегда писать кросс-платформенный код, но разница в производительности не критична - например, python всегда будет работать медленнее, чем PHP, поэтому, если вам нужна производительность, лучше создавать сайт с PHP, Twig и Symfony2 или другим способом. Грустно, но правда.
  • 0
    @Croll, если ваш сайт выполняет сложные вычисления, тогда библиотеки python несравненно быстрее, иначе узким местом является база данных, или вы, вероятно, делаете что-то действительно неправильно
3

Согласно документации Jinja, Поддержка Python 3 все еще экспериментальна. Поэтому, если вы находитесь на Python 3, и производительность не проблема, вы можете использовать django, встроенный в механизм шаблонов.

Django 1.8 ввел поддержку нескольких механизмов шаблонов, которые требуют изменения способа инициализации шаблонов. Вы должны явно настроить settings.DEBUG, который используется механизмом шаблонов по умолчанию, предоставленным django. Здесь код для использования шаблонов без использования остальных django.

from django.template import Template, Context
from django.template.engine import Engine

from django.conf import settings
settings.configure(DEBUG=False)

template_string = "Hello {{ name }}"
template = Template(template_string, engine=Engine())
context = Context({"name": "world"})
output = template.render(context) #"hello world"
2

Спасибо за помощь. Вот еще одно дополнение. Случай, когда вам нужно использовать собственные теги шаблонов.

Скажем, у вас есть этот важный тег шаблона в модуле read.py

from django import template

register = template.Library()

@register.filter(name='bracewrap')
def bracewrap(value):
    return "{" + value + "}"

Это файл шаблона html temp.html:

{{var|bracewrap}}

Наконец, вот Python script, который свяжет все вместе

import django
from django.conf import settings
from django.template import Template, Context
import os

#load your tags
from django.template.loader import get_template
django.template.base.add_to_builtins("read")

# You need to configure Django a bit
settings.configure(
    TEMPLATE_DIRS=(os.path.dirname(os.path.realpath(__file__)), ),
)

#or it could be in python
#t = Template('My name is {{ my_name }}.')
c = Context({'var': 'stackoverflow.com rox'})

template = get_template("temp.html")
# Prepare context ....
print template.render(c)

Выход будет

{stackoverflow.com rox}
  • 0
    django.template.base.add_to_builtins("read") вызывает django.template.base.add_to_builtins("read") ValueError для меня.
  • 0
    выдает ошибку TemplateDoesNotExist Я использую django 1.10.1
2

Я бы сказал Jinja. Это определенно более мощный, чем Django Templating Engine, и он автономный.

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

manage.py generatereports --format=html

Но я не думаю, что стоит просто использовать Django Templating Engine вместо Jinja.

1

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

  • 0
    смелое утверждение! ссылка на сайт?
  • 0
    Порт Python выглядит слишком похоже на Java. Это не питон.
1

Найдено следующее:

http://snippets.dzone.com/posts/show/3339

0

В дополнение к тому, что еще написал, если вы хотите использовать Django Template на Django > 1.7, вы должны указать свой параметр settings.configure(...) для вызова переменной TEMPLATES и вызвать django.setup() следующим образом:

from django.conf import settings

settings.configure(TEMPLATES=[
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['.'], # if you want the templates from a file
        'APP_DIRS': False, # we have no apps
    },
])

import django
django.setup()

Затем вы можете загрузить свой шаблон, как обычно, из строки:

from django import template   
t = template.Template('My name is {{ name }}.')   
c = template.Context({'name': 'Rob'})   
t.render(c)

И если вы написали переменную DIRS в .configure, с диска:

from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})

Ошибка Django: нет настроек брандмауэра DjangoTemplates

http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts

0

При запуске оболочки manage.py:

>>> from django import template   
>>> t = template.Template('My name is {{ me }}.')   
>>> c = template.Context({'me': 'ShuJi'})   
>>> t.render(c)
0

Google AppEngine использует механизм шаблонов Django, посмотрели ли вы, как они это делают? Вы могли бы просто использовать это.

0

Я повторяю приведенные выше утверждения. Jinja 2 - довольно хороший набор шаблонов Django для общего использования. Я думаю, что они работают над тем, чтобы сделать шаблоны Django немного менее связанными с параметрами settings.py, но Jinja должен преуспеть для вас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню