Domanda

Voglio utilizzare il motore dei modelli Django nel mio codice (Python), ma non sto creando un sito Web basato su Django.Come posso usarlo senza avere un file settings.py (e altri) e dover impostare la variabile d'ambiente DJANGO_SETTINGS_MODULE?

Se eseguo il seguente codice:

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

Ottengo:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
È stato utile?

Soluzione

La soluzione è semplice.In realtà lo è Ben documentato, ma non troppo facile da trovare.(Ho dovuto scavare un po' in giro: non è venuto fuori quando ho provato diverse ricerche su Google.)

Il seguente codice funziona:

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

Consulta la documentazione di Django (link sopra) per una descrizione di alcune delle impostazioni che potresti voler definire (come argomenti di parole chiave da configurare).

Altri suggerimenti

Jinja2 sintassi è praticamente uguale a quello di Django con pochissime differenze e ottieni un motore di template molto più potente, che compila anche il tuo template in bytecode (VELOCE!).

Lo uso per i template, incluso nello stesso Django, ed è molto buono.Puoi anche scrivere facilmente estensioni se manca qualche funzionalità che desideri.

Ecco alcune dimostrazioni della generazione del codice:

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

Qualche motivo particolare per cui desideri utilizzare i modelli di Django?Entrambi Jinja E Genshi sono secondo me superiori.


Se lo vuoi davvero, guarda il Documentazione Django attiva settings.py.In particolare la sezione "Utilizzo delle impostazioni senza impostazione DJANGO_SETTINGS_MODULE".Usa qualcosa del genere:

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

Consiglierei anche jinja2.C'è un bell'articolo SU django contro jinja2 che fornisce alcune informazioni dettagliate sul motivo per cui dovresti preferire il secondo.

Secondo la documentazione Jinja, Il supporto di Python 3 è ancora sperimentale.Quindi, se utilizzi Python 3 e le prestazioni non sono un problema, puoi utilizzare il motore di template integrato di django.

Django 1.8 ha introdotto il supporto per più motori di modelli che richiede una modifica al modo in cui i modelli vengono inizializzati.È necessario configurare esplicitamente settings.DEBUG che viene utilizzato dal motore di modelli predefinito fornito da django.Ecco il codice per utilizzare i modelli senza utilizzare il resto di 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"

direi Jinja anche.Lo è sicuramente più potente rispetto a Django Templating Engine e lo è indipendente, autonomo.

Se si trattasse di un plug esterno per un'applicazione Django esistente, potresti creare un comando personalizzato e utilizza il motore dei modelli all'interno dell'ambiente dei tuoi progetti.Come questo;

manage.py generatereports --format=html

Ma non penso che valga la pena usare semplicemente il Django Templating Engine invece di Jinja.

Grazie per l'aiuto gente.Ecco un'altra aggiunta.Il caso in cui è necessario utilizzare tag di modello personalizzati.

Diciamo che hai questo importante tag template nel modulo read.py

from django import template

register = template.Library()

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

Questo è il file modello html "temp.html":

{{var|bracewrap}}

Infine, ecco uno script Python che collegherà tutto insieme

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)

L'output sarebbe

{stackoverflow.com rox}

Non.Utilizzo StringTemplate invece, non c'è motivo di prendere in considerazione qualsiasi altro motore di template una volta che ne sei venuto a conoscenza.

In aggiunta a quanto scritto da altri, se vuoi usare Django Template su Django > 1.7, devi dare al tuo settings.configure(...) chiamare la variabile TEMPLATES e chiamare django.setup() in questo modo:

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

Quindi puoi caricare il tuo modello come normalmente, da una stringa:

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

E se hai scritto la variabile DIRS nel .configure, dal disco:

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

Errore Django:Nessun backend DjangoTemplates configurato

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

Mi associo alle affermazioni di cui sopra.Jinja 2 è un superset piuttosto buono di modelli Django per uso generale.Penso che stiano lavorando per rendere i modelli Django un po' meno accoppiati con settings.py, ma Jinja dovrebbe andare bene per te.

Durante l'esecuzione del manage.py conchiglia:

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

Google AppEngine utilizza il motore di template Django, hai dato un'occhiata a come lo fanno?Potresti semplicemente usarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top