Pergunta

Eu quero usar o mecanismo de modelo Django no meu código (Python), mas eu não estou construindo um web site baseado em Django. Como faço para usá-lo sem ter um arquivo settings.py (e outros) e ter que definir a variável de ambiente DJANGO_SETTINGS_MODULE?

Se eu executar o código a seguir:

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

eu recebo:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

Outras dicas

Jinja2 sintaxe é praticamente o mesmo que o Django com muito poucas diferenças, e você terá um modelo de motor muito mais potente, que também compila seu modelo para bytecode (FAST!).

Eu uso ele para modelagem, inclusive no próprio Django, e é muito bom. Você pode também extensões facilmente escrever se alguma característica que você quer está em falta.

Aqui estão algumas demonstração da geração de código:

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

Você tem algum motivo específico que você deseja usar modelos do Django? Ambos Jinja e Genshi são, na minha opinião, superior.


Se você realmente quer, em seguida, consulte a documentação do Django em settings.py . Especialmente a seção "Usando as configurações sem definir DJANGO_SETTINGS_MODULE". Use algo como isto:

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

Eu também recomendaria Jinja2. Há um belo artigo em django vs. jinja2 que dá algumas informações em detalhes sobre por que você deve prefere o mais tarde.

De acordo com a documentação Jinja, apoio Python 3 ainda é experimental. Então, se você estiver em Python 3 e desempenho não é um problema, você pode usar o Django é construído em modelo de motor.

Django 1.8 introduziu suporte para vários motores de modelo que requer uma alteração na forma como modelos são inicializados. Você tem que settings.DEBUG explicitamente configure que é usado pelo motor modelo padrão fornecido pelo Django. Aqui está o código para usar modelos sem usar o resto do 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"

Eu diria Jinja também. É definitivamente mais poderoso do que Django Templating Motor e é ficar sozinho .

Se este era um plug externo para uma aplicação Django existente, você poderia criar um comando personalizado e usam o motor de templates no seu ambiente de projetos. Assim;

manage.py generatereports --format=html

Mas eu não acho que vale a pena apenas usando o Templating Motor Django em vez de Jinja.

Obrigado pelas pessoas ajuda. Aqui está mais uma adição. O caso em que você precisa usar tags de modelos personalizados.

Vamos dizer que você tem esta importante marca de modelo no módulo read.py

from django import template

register = template.Library()

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

Este é o arquivo de modelo html "temp.html":

{{var|bracewrap}}

Finalmente, aqui é um script Python que vai amarrar a todos juntos

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)

A saída seria

{stackoverflow.com rox}

Não faça isso. Use StringTemplate vez -. Não há nenhuma razão para considerar qualquer outro modelo de motor uma vez que você sabe sobre ele

Um além do que outro escreveu, se você quiser usar o modelo Django Django em> 1.7, você deve dar o seu settings.configure (...) chamar a variável modelos e chamar django.setup () como este:

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

Em seguida, você pode carregar o seu modelo como normalmente, a partir de uma string:

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

E se você escreveu a variável DIRS na .configure, a partir do disco:

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

Django Erro: Não DjangoTemplates backend está configurado

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

Faço minhas as afirmações acima. Jinja 2 é um bom super conjunto de modelos de Django para uso geral. Acho que eles estão trabalhando para tornar o Django modelos um pouco menos acoplado ao settings.py, mas Jinja deve fazer bem para você.

Durante a execução do shell manage.py:

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

O Google AppEngine usa o motor de templates Django, você deu uma olhada em como eles fazem isso? Você poderia apenas usar isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top