Як використовувати шаблони Django без решти Django?


101

Я хочу використовувати двигун шаблонів Django у своєму коді (Python), але я не будую веб-сайт на основі Джанго. Як я можу використовувати його, не маючи файл 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.

Відповіді:


133

Рішення просте. Це насправді добре задокументовано , але не дуже легко знайти. (Мені довелося копатись - це не вийшло, коли я спробував кілька різних пошуків 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')
Брайс

Документація для settings.configure () знаходиться тут - docs.djangoproject.com/en/1.7/topics/settings
Скотт

З посилання "добре задокументоване" вище, це стосується версії 1.7. Починаючи з 1.8, здається, вам більше не потрібно settings.configure().
Олаф Дієше

Якщо ви хочете включити інші шаблони або скористатися успадкуванням шаблонів, рішення, вказане Брайсом, є необхідним.
titusjan

6
Мені додатково потрібно було зателефонувати django.setup () перед конструктором шаблонів.
Аміт

44

Синтаксис Jinja2 майже такий самий, як у 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'

4
Я використовую Jinja у своєму проекті, тому що я хотів щось, з чим я був досить знайомий, але не хотів, щоб мої користувачі (оскільки це розповсюджена програма) мали встановити Django. Плюсом є те, що Jinja можна встановити за допомогою easy_install.
Xiong Chiamiov

4
Django може бути встановлений і з easy_install.
гегемон

Jinga офіційно ще не підтримує Python3. За даними сайту, це все ще експериментально.
Прамод

9

З якоїсь конкретної причини ви хочете використовувати шаблони Джанго? Обидва Дзиндзя і Genshi , на мій погляд, краще.


Якщо ви справді цього хочете, перегляньте документацію на Djangosettings.py . Особливо розділ "Використання налаштувань без налаштування DJANGO_SETTINGS_MODULE". Використовуйте щось подібне:

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

7

Я б також рекомендував jinja2. Є чудова стаття про djangovs., jinja2яка дає деяку детальну інформацію про те, чому вам слід віддавати перевагу пізнішому.


Я віддаю перевагу Jinja2 через {% set %}синтаксис та рівність двигуну шаблону Twig (PHP). Краще писати код крос-платформи завжди, але різниця в продуктивності не є критичною - наприклад, python завжди працюватиме повільніше, ніж PHP, тому якщо вам потрібна продуктивність, то краще створити сайт за допомогою PHP, Twig та Symfony2 або іншого. Сумно, але правда.
Кролл

@Croll, Якщо ваш веб-сайт виконує складні обчислення, то бібліотеки python незрівнянно швидші, інакше вузьке місце є базою даних або ви, ймовірно, робите щось дійсно не так
Боб

4

Згідно з документацією 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"

4

На додаток до того, що писали інші, якщо ви хочете використовувати шаблон Django на Django> 1.7, ви повинні надати налаштування.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


2

Я б сказав також Джинджа . Він, безумовно, більш потужний, ніж Django Templating Engine, і він стоїть окремо .

Якщо це зовнішній модуль для існуючої програми Django, ви можете створити власну команду та використовувати двигун шаблонів у вашому середовищі проектів. Подобається це;

manage.py generatereports --format=html

Але я не вважаю, що варто використовувати Двигун Джанго, а не Джинджу.


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, який прив’яже всіх разом

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}

django.template.base.add_to_builtins("read")піднімає ValueErrorдля мене.
морська риба

дає TemplateDoesNotExistпомилку Я використовую django 1.10.1
Vikrant Singh


1

Не варто. Використовуйте натомість StringTemplate - немає ніяких підстав вважати будь-який інший двигун шаблону, як тільки ви дізнаєтесь про нього.


Порт Python дуже схожий на Java. Це не пітонічно.
Майкл Баклі

0

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


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, ви подивилися, як вони це роблять? Ви можете, можливо, просто використовувати це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.