Bagaimana saya menggunakan cetakan Django tanpa sisa Django?

101

Saya ingin menggunakan mesin cetakan Django dalam kode (Python) saya, tetapi saya tidak sedang membangun situs web berbasis Django. Bagaimana cara saya menggunakannya tanpa memiliki file settings.py (dan lainnya) dan harus mengatur variabel lingkungan DJANGO_SETTINGS_MODULE?

Jika saya menjalankan kode berikut:

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

Saya mendapat:

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

Jawaban:

133

Solusinya sederhana. Ini sebenarnya terdokumentasi dengan baik , tetapi tidak terlalu mudah ditemukan. (Saya harus mencari-cari - itu tidak muncul ketika saya mencoba beberapa pencarian Google yang berbeda.)

Kode berikut berfungsi:

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

Lihat dokumentasi Django (ditautkan di atas) untuk penjelasan dari beberapa pengaturan yang mungkin ingin Anda definisikan (sebagai argumen kata kunci untuk dikonfigurasi).

Daryl Spitzer
sumber
13
Dan untuk mendapatkannya dari file: settings.configure (TEMPLATE_DIRS = (".",)) T = get_template ('test.html')
Bryce
Dokumentasi untuk settings.configure () ada di sini - docs.djangoproject.com/en/1.7/topics/settings
Scott
Dari tautan "terdokumentasi dengan baik" di atas, ini berlaku hingga versi 1.7. Mulai dari 1.8, sepertinya Anda tidak perlu settings.configure()lagi.
Olaf Dietsche
Jika Anda ingin menyertakan template lain, atau menggunakan template inheritance, solusi di atas oleh Bryce diperlukan.
titusjan
6
Saya juga perlu memanggil django.setup () sebelum konstruktor Template.
Amit
44

Sintaks Jinja2 hampir sama dengan Django dengan sedikit perbedaan, dan Anda mendapatkan mesin templat yang jauh lebih hebat, yang juga mengkompilasi templat Anda ke bytecode (CEPAT!).

Saya menggunakannya untuk membuat template, termasuk di Django itu sendiri, dan itu sangat bagus. Anda juga dapat dengan mudah menulis ekstensi jika beberapa fitur yang Anda inginkan hilang.

Berikut adalah beberapa demonstrasi pembuatan kode:

>>> 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.dll
sumber
4
Saya menggunakan Jinja dalam proyek saya, karena saya menginginkan sesuatu yang cukup saya kenal, tetapi tidak ingin pengguna saya (karena ini adalah aplikasi yang dapat didistribusikan) harus memasang Django. Nilai tambahnya adalah Jinja dapat diinstal dengan easy_install.
Xiong Chiamiov
4
Django dapat diinstal dengan easy_install juga.
hegemon
Jinga belum secara resmi mendukung Python3. Menurut situs tersebut, Ini masih eksperimental.
Pramod
9

Adakah alasan khusus Anda ingin menggunakan cetakan Django? Baik Jinja dan Genshi , menurut saya, lebih unggul.


Jika Anda benar-benar menginginkannya, lihat dokumentasi Django disettings.py . Terutama bagian "Menggunakan pengaturan tanpa pengaturan DJANGO_SETTINGS_MODULE". Gunakan sesuatu seperti ini:

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

Saya juga merekomendasikan jinja2. Ada artikel bagus tentang djangovs. jinja2yang memberikan beberapa informasi rinci tentang mengapa Anda harus memilih nanti.

olt
sumber
Saya lebih suka Jinja2 karena {% set %}sintaks dan persamaannya dengan mesin template Twig (PHP). Lebih baik menulis kode lintas platform selalu, tetapi perbedaan kinerja tidak terlalu penting - misalnya, python akan selalu bekerja lebih lambat daripada PHP jadi jika Anda membutuhkan kinerja, Anda lebih baik membuat situs dengan PHP, Twig dan Symfony2 atau yang lain. Sedih tapi sebenarnya.
Croll
@Croll, Jika situs web Anda melakukan komputasi yang kompleks, maka pustaka python jauh lebih cepat, jika tidak, hambatannya adalah basis data atau Anda kemungkinan besar melakukan sesuatu yang salah
Bob
4

Menurut dokumentasi Jinja, dukungan Python 3 masih bersifat eksperimental . Jadi jika Anda menggunakan Python 3 dan kinerja tidak menjadi masalah, Anda dapat menggunakan mesin templat bawaan django.

Django 1.8 memperkenalkan dukungan untuk beberapa mesin cetakan yang membutuhkan perubahan cara templat diinisialisasi. Anda harus secara eksplisit mengkonfigurasi settings.DEBUGmana yang digunakan oleh mesin cetakan default yang disediakan oleh django. Berikut kode untuk menggunakan template tanpa menggunakan django lainnya.

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
sumber
4

Tambahan untuk apa yang ditulis lain, jika Anda ingin menggunakan Template Django pada Django> 1.7, Anda harus memberikan pengaturan Anda. Configure (...) panggil variabel TEMPLATES dan panggil django.setup () seperti ini:

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

Kemudian Anda dapat memuat template Anda seperti biasa, dari string:

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

Dan jika Anda menulis variabel DIRS di .configure, dari disk:

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

Kesalahan Django: Tidak ada backend DjangoTemplates yang dikonfigurasi

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

Robert Vanden Eynde
sumber
2

Saya akan mengatakan Jinja juga. Ini jelas lebih bertenaga daripada Mesin Templating Django dan berdiri sendiri .

Jika ini adalah steker eksternal ke aplikasi Django yang ada, Anda dapat membuat perintah kustom dan menggunakan mesin template dalam lingkungan proyek Anda. Seperti ini;

manage.py generatereports --format=html

Tapi saya rasa tidak ada gunanya hanya menggunakan Mesin Templating Django daripada Jinja.

muhuk
sumber
2

Terima kasih atas bantuannya. Ini satu tambahan lagi. Kasus ketika Anda perlu menggunakan tag template kustom.

Misalkan Anda memiliki tag template penting ini di module read.py

from django import template

register = template.Library()

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

Ini adalah file template html "temp.html":

{{var|bracewrap}}

Terakhir, berikut adalah skrip Python yang akan mengikat semuanya

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)

Hasilnya adalah

{stackoverflow.com rox}
Gourneau
sumber
django.template.base.add_to_builtins("read")menimbulkan ValueErroruntuk saya.
oarfish
memberikan TemplateDoesNotExistkesalahan Saya menggunakan django 1.10.1
Vikrant Singh
1

Jangan. Gunakan StringTemplate sebagai gantinya - tidak ada alasan untuk mempertimbangkan mesin template lain setelah Anda mengetahuinya.

Rob Williams
sumber
Porta Python terlihat terlalu seperti Java. Itu bukan pythonic.
Michael Buckley
0

Saya menggemakan pernyataan di atas. Jinja 2 adalah superset dari templat Django yang cukup bagus untuk penggunaan umum. Saya pikir mereka sedang bekerja untuk membuat cetakan Django sedikit lebih sedikit digabungkan dengan settings.py, tetapi Jinja harus melakukannya dengan baik untuk Anda.

Clint Ecker
sumber
0

Saat menjalankan manage.pyshell:

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

Google AppEnginemenggunakan mesin template Django, pernahkah Anda melihat bagaimana mereka melakukannya? Anda mungkin bisa menggunakan itu.

William Keller
sumber