Wie verwende ich Django-Vorlagen ohne den Rest von Django?
-
01-07-2019 - |
Frage
Ich mag die Django Template-Engine verwenden, in meinem (Python) Code, aber ich bin nicht eine Django-basierte Web-Site aufzubauen. Wie verwende ich es ohne eine settings.py Datei mit (und anderen) und mit der DJANGO_SETTINGS_MODULE Umgebungsvariable setzen?
Wenn ich den folgenden Code:
>>> import django.template
>>> from django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')
ich:
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
Lösung
Die Lösung ist einfach. Es ist eigentlich gut dokumentiert , aber nicht zu leicht zu finden. (Ich hatte um zu graben -. Es ist nicht gekommen, wenn ich ein paar verschiedene Google-Suchanfragen versucht)
Der folgende Code funktioniert:
>>> 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.'
Sehen Sie die Django-Dokumentation (oben verlinkten) für eine Beschreibung von einigen der Einstellungen, die Sie definieren möchten, können (als Keyword-Argumente zu konfigurieren).
Andere Tipps
Jinja2
Jeder besonderer Grund Sie Djangos Vorlagen verwenden? Sowohl Jinja und Genshi ist, meiner Meinung nach, überlegen. Wenn Sie wirklich wollen, dann finden Sie in der Django Dokumentation auf
settings.py
. Vor allem der Bereich „Einstellungen verwenden, ohne DJANGO_SETTINGS_MODULE
Einstellung“. Verwenden Sie so etwas wie folgt aus: from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
Ich würde auch jinja2 empfehlen. Es gibt ein schöner Artikel auf django
vs. jinja2
, dass einige im Detail Informationen gibt an, warum Sie die später prefere sollte.
Nach der Dokumentation Jinja, Python 3 Unterstützung ist nach wie vor Versuch . Also, wenn Sie auf Python 3 und Performance ist kein Problem, können Sie Djangos in Template-Engine gebaut verwenden.
Django 1.8 eingeführte Unterstützung für welche erfordert die Art und Weise eine Änderung Vorlagen initialisiert werden. Sie müssen explizit settings.DEBUG
konfigurieren, die von der Standard-Template-Engine von django vorgesehen verwendet wird. Hier ist der Code-Vorlagen zu verwenden, ohne den Rest django zu verwenden.
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"
Ich würde sagen, Jinja auch. Es ist auf jeden Fall mächtiger als Django Template-Engine und es ist stand alone .
Wenn dies ein externer Stecker an eine bestehende Django-Anwendung war, konnte man a href erstellen <= "http://docs.djangoproject.com/en/dev/howto/custom-management-commands/#howto-custom- Management-Befehle“rel =‚nofollow noreferrer‘> ein benutzerdefinierter Befehl und verwenden Sie die Template-Engine in Ihren Projekten Umgebung. Wie dies;
manage.py generatereports --format=html
Aber ich glaube nicht, ist es wert, nur die Django Template-Engine anstelle von Jinja verwendet wird.
Vielen Dank für die Hilfe Leute. Hier ist eine weitere Ergänzung. Der Fall, in dem Sie benötigen, um benutzerdefinierte Vorlagen-Tags verwendet werden.
Angenommen, Sie haben diesen wichtigen Template-Tag in dem Modul read.py haben
from django import template
register = template.Library()
@register.filter(name='bracewrap')
def bracewrap(value):
return "{" + value + "}"
Dies ist die HTML-Template-Datei "temp.html":
{{var|bracewrap}}
Schließlich, hier ist ein Python-Skript, das für alle zusammen
binden wirdimport 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)
Der Ausgang wäre
{stackoverflow.com rox}
Gefunden folgt aus:
Nicht. Verwenden Sie String statt -. Es gibt keinen Grund, andere Template-Engine zu prüfen, sobald man darüber wissen
Eine Ergänzung zu dem, was andere geschrieben, wenn Sie Django Vorlage auf Django> 1.7 verwenden möchten, können Sie Ihre settings.configure geben muss (...), um die VORLAGEN Variable rufen und rufen django.setup () wie folgt aus:
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()
Dann können Sie Ihre Vorlage laden wie normalerweise aus einem String:
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Rob'})
t.render(c)
Und wenn Sie die DIRS Variable in der .configure schreiben, von der Festplatte:
from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})
Django Fehler: Kein DjangoTemplates Backend konfiguriert ist
http://django.readthedocs.io/en /latest/releases/1.7.html#standalone-scripts
I echo die obigen Ausführungen. Jinja 2 ist eine ziemlich gute Obermenge von Django-Vorlagen für den allgemeinen Gebrauch. Ich glaube, sie arbeiten daran, die Django etwas weniger Vorlagen zum settings.py gekoppelt, aber Jinja sollte für Sie tun gut.
Während die manage.py
Shell ausgeführt wird:
>>> from django import template
>>> t = template.Template('My name is {{ me }}.')
>>> c = template.Context({'me': 'ShuJi'})
>>> t.render(c)
Google AppEngine
verwendet den Motor Django Templating, haben Sie einen Blick auf, wie sie es tun genommen? Sie könnten möglicherweise nur, dass verwenden.