Jak używać szablonów Django bez reszty Django?

101

Chcę używać silnika szablonów Django w moim kodzie (Python), ale nie buduję witryny internetowej opartej na Django. Jak go używać bez posiadania pliku settings.py (i innych) i konieczności ustawiania zmiennej środowiskowej DJANGO_SETTINGS_MODULE?

Jeśli uruchomię następujący kod:

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

Dostaję:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
Daryl Spitzer
źródło

Odpowiedzi:

133

Rozwiązanie jest proste. Właściwie jest dobrze udokumentowany , ale nie jest łatwy do znalezienia. (Musiałem się rozejrzeć - nie pojawił się, gdy próbowałem kilku różnych wyszukiwań w Google.)

Poniższy kod działa:

>>> 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.'

Zobacz dokumentację Django (link powyżej), aby uzyskać opis niektórych ustawień, które możesz chcieć zdefiniować (jako argumenty słów kluczowych do skonfigurowania).

Daryl Spitzer
źródło
13
Aby uzyskać to z pliku: settings.configure (TEMPLATE_DIRS = (".",)) T = get_template ('test.html')
Bryce
Dokumentacja settings.configure () jest tutaj - docs.djangoproject.com/en/1.7/topics/settings
Scott
Z powyższego łącza „dobrze udokumentowane” dotyczy to wersji 1.7. Począwszy od 1.8, wydaje się, że settings.configure()już nie potrzebujesz .
Olaf Dietsche
Jeśli chcesz dołączyć inne szablony lub skorzystać z dziedziczenia szablonów, powyższe rozwiązanie Bryce'a jest konieczne.
titusjan
6
Dodatkowo musiałem wywołać django.setup () przed konstruktorem Template.
Amit
44

Składnia Jinja2 jest prawie taka sama jak w Django, z bardzo niewielkimi różnicami, a ponadto otrzymujesz znacznie bardziej wydajny silnik szablonów, który również kompiluje Twój szablon do kodu bajtowego (SZYBKO!).

Używam go do tworzenia szablonów, w tym w samym Django, i jest bardzo dobry. Możesz także łatwo pisać rozszerzenia, jeśli brakuje jakiejś funkcji.

Oto kilka demonstracji generowania kodu:

>>> 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'
nosklo
źródło
4
Używam Jinja w moim projekcie, ponieważ chciałem czegoś, co znam, ale nie chciałem, aby moi użytkownicy (ponieważ jest to aplikacja do dystrybucji) musieli instalować Django. Plusem jest to, że Jinja można zainstalować za pomocą easy_install.
Xiong Chiamiov
4
Django można również zainstalować za pomocą easy_install.
hegemon
Jinga jeszcze oficjalnie nie obsługuje Python3. Według strony, nadal jest eksperymentalna.
Pramod
9

Czy jest jakiś szczególny powód, dla którego chcesz używać szablonów Django? Zarówno Jinja i Genshi są, moim zdaniem, lepszy.


Jeśli naprawdę chcesz, zobacz dokumentację Django nasettings.py . Zwłaszcza sekcja „Korzystanie z ustawień bez ustawień DJANGO_SETTINGS_MODULE”. Użyj czegoś takiego:

from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
John Millikin
źródło
7

Poleciłbym również jinja2. Jest fajny artykuł na temat djangovs., jinja2który zawiera szczegółowe informacje na temat tego, dlaczego powinieneś preferować później.

olt
źródło
Preferuję Jinja2 ze względu na {% set %}składnię i równość względem silnika szablonów Twig (PHP). Lepiej jest zawsze pisać kod międzyplatformowy, ale różnica w wydajności nie jest krytyczna - na przykład Python zawsze będzie działał wolniej niż PHP, więc jeśli potrzebujesz wydajności, lepiej stwórz witrynę z PHP, Twig i Symfony2 lub innym. Smutne, ale prawda.
Croll
@Croll, Jeśli Twoja witryna wykonuje złożone obliczenia, biblioteki Pythona są nieporównywalnie szybsze, w przeciwnym razie wąskim gardłem jest baza danych lub prawdopodobnie robisz coś naprawdę złego
Bob
4

Zgodnie z dokumentacją Jinja, obsługa Pythona 3 jest nadal eksperymentalna . Więc jeśli korzystasz z Pythona 3 i wydajność nie jest problemem, możesz użyć wbudowanego silnika szablonów django.

Django 1.8 wprowadziło obsługę wielu silników szablonów, co wymaga zmiany sposobu inicjalizacji szablonów. Musisz jawnie skonfigurować, settings.DEBUGktóry jest używany przez domyślny silnik szablonów dostarczony przez django. Oto kod do używania szablonów bez używania reszty 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"
Pramod
źródło
4

Oprócz tego, co napisali inni, jeśli chcesz użyć szablonu Django na Django> 1.7, musisz podać swoje ustawienia.configure (...) wywołać zmienną TEMPLATES i wywołać django.setup () w następujący sposób:

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()

Następnie możesz załadować swój szablon jak zwykle, z łańcucha:

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

A jeśli zapisałeś zmienną DIRS w pliku .configure, z dysku:

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

Błąd Django: Nie skonfigurowano żadnego zaplecza DjangoTemplates

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

Robert Vanden Eynde
źródło
2

Powiedziałbym również, że Jinja . Jest zdecydowanie potężniejszy niż Django Templating Engine i jest samodzielny .

Gdyby była to zewnętrzna wtyczka do istniejącej aplikacji Django, można by stworzyć niestandardowe polecenie i użyć silnika szablonów w środowisku projektów. Lubię to;

manage.py generatereports --format=html

Ale nie sądzę, że warto po prostu używać Django Templating Engine zamiast Jinja.

muhuk
źródło
2

Dzięki za pomoc. Oto jeszcze jeden dodatek. Sytuacja, w której musisz użyć niestandardowych tagów szablonu.

Powiedzmy, że masz ten ważny tag szablonu w module read.py

from django import template

register = template.Library()

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

To jest plik szablonu html „temp.html”:

{{var|bracewrap}}

Na koniec mamy skrypt Pythona, który będzie powiązany ze wszystkimi

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)

Wynik byłby

{stackoverflow.com rox}
Gourneau
źródło
django.template.base.add_to_builtins("read")podnosi ValueErrordla mnie.
wstęgi
daje TemplateDoesNotExistbłąd Używam django 1.10.1
Vikrant Singh
1

Nie. Zamiast tego użyj StringTemplate - nie ma powodu, aby rozważać inny silnik szablonów, gdy się o nim dowiesz.

Rob Williams
źródło
Port Pythona wygląda zbyt podobnie do Java. To nie jest pytoniczne.
Michael Buckley
0

Powtarzam powyższe stwierdzenia. Jinja 2 to całkiem niezły zestaw szablonów Django do ogólnego użytku. Myślę, że pracują nad tym, aby szablony Django były trochę mniej powiązane z settings.py, ale Jinja powinna dobrze Ci się przydać.

Clint Ecker
źródło
0

Podczas uruchamiania manage.pypowłoki:

>>> from django import template   
>>> t = template.Template('My name is {{ me }}.')   
>>> c = template.Context({'me': 'ShuJi'})   
>>> t.render(c)
hupantingxue
źródło
0

Google AppEngineużywa silnika szablonów Django, czy przyjrzałeś się, jak to robi? Możesz tego po prostu użyć.

William Keller
źródło