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

Я хочу использовать шаблонизатор 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.

person Daryl Spitzer    schedule 18.09.2008    source источник


Ответы (13)


Решение простое. На самом деле это хорошо документировано, но найти его не так-то просто. (Пришлось покопаться - ничего не вышло, когда я попробовал несколько разных поисков в 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 (ссылка выше) для описания некоторых параметров, которые вы, возможно, захотите определить (в качестве аргументов ключевого слова для настройки).

person Daryl Spitzer    schedule 19.09.2008
comment
И получить его из файла: settings.configure (TEMPLATE_DIRS = (.,)) T = get_template ('test.html') - person Bryce; 16.09.2013
comment
Документация для settings.configure () находится здесь - docs.djangoproject.com/en/ 1.7 / темы / настройки - person Scott; 28.02.2015
comment
Судя по хорошо документированной ссылке выше, это верно до версии 1.7. Начиная с 1.8, похоже, вам больше не нужен settings.configure(). - person Olaf Dietsche; 27.07.2015
comment
Если вы хотите включить другие шаблоны или использовать наследование шаблонов, необходимо решение Bryce, указанное выше. - person titusjan; 11.11.2015
comment
Как при таком подходе загружать такие приложения, как mathfilters? - person oarfish; 02.12.2015
comment
Мне также нужно было вызвать django.setup () перед конструктором шаблона. - person Amit; 19.01.2016
comment
Я использую django 3.0.8, и мне нужно указать ШАБЛОНЫ, например, settings.configure(TEMPLATES=TEMPLATES) - person kayochin; 25.07.2020

Jinja2 синтаксис почти такой же, как у Django, с небольшими отличиями, и вы получаете гораздо более мощный механизм шаблонов, который также компилирует ваш шаблон в байт-код (БЫСТРО!).

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

Вот некоторая демонстрация генерации кода:

>>> import jinja2
>>> print jinja2.Environment().compile('{% for row in data %}{{ row.name | upper }}{% endfor %}', raw=True) 
from __future__ import division
from jinja2.runtime import LoopContext, Context, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join
name = None

def root(context, environment=environment):
    l_data = context.resolve('data')
    t_1 = environment.filters['upper']
    if 0: yield None
    for l_row in l_data:
        if 0: yield None
        yield unicode(t_1(environment.getattr(l_row, 'name')))

blocks = {}
debug_info = '1=9'
person nosklo    schedule 19.09.2008
comment
Я использую Jinja в своем проекте, потому что мне нужно было что-то, с чем я был достаточно знаком, но не хотел, чтобы моим пользователям (поскольку это распространяемое приложение) приходилось устанавливать Django. Плюс в том, что Jinja можно установить с помощью easy_install. - person Xiong Chiamiov; 17.07.2009
comment
Django также можно установить с помощью easy_install. - person hegemon; 22.03.2010
comment
Jinga официально еще не поддерживает Python3. Согласно сайту, это все еще экспериментально. - person Pramod; 28.12.2015

По какой причине вы хотите использовать шаблоны Django? И Jinja, и Генши, на мой взгляд, выше.


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

from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
person John Millikin    schedule 18.09.2008

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

person olt    schedule 20.09.2008
comment
Я предпочитаю Jinja2 из-за синтаксиса {% set %} и равенства движку шаблонов Twig (PHP). Лучше всегда писать кросс-платформенный код, но разница в производительности не критична - например, python всегда будет работать медленнее, чем PHP, поэтому, если вам нужна производительность, вам лучше создать сайт с помощью PHP, Twig и Symfony2 или еще. Печально, но правда. - person Croll; 17.11.2015
comment
@Croll, если ваш веб-сайт выполняет сложные вычисления, библиотеки python работают несравнимо быстрее, иначе узким местом является база данных или вы, вероятно, делаете что-то действительно неправильно - person Bob; 24.08.2017

Согласно документации 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"
person Pramod    schedule 28.12.2015

В дополнение к тому, что писали другие, если вы хотите использовать шаблон Django в Django> 1.7, вы должны указать в своих настройках. Config (...) вызывать переменную 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.

person Robert Vanden Eynde    schedule 24.11.2017

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

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

from django import template

register = template.Library()

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

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

{{var|bracewrap}}

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

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}
person Gourneau    schedule 09.12.2013
comment
django.template.base.add_to_builtins("read") поднимает мне ValueError. - person oarfish; 02.12.2015
comment
дает TemplateDoesNotExist ошибку Я использую django 1.10.1 - person Vikrant Singh; 26.09.2016

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

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

manage.py generatereports --format=html

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

person muhuk    schedule 05.12.2008

Нашел это:

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

person Lou Franco    schedule 18.09.2008

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

person Rob Williams    schedule 20.11.2008
comment
Порт Python слишком похож на Java. Это не питонический. - person Michael Buckley; 06.05.2015

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

person Clint Ecker    schedule 19.09.2008

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

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

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

person William Keller    schedule 18.09.2008