(Python)コードでDjangoテンプレートエンジンを使用したいのですが、DjangoベースのWebサイトを構築していません。settings.pyファイルを使用せずに使用するにはどうすればよいですか(およびその他)およびDjango_SETTINGS_MODULE環境変数を設定する必要がありますか?
次のコードを実行すると:
>>> import Django.template
>>> from Django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')
私は得る:
ImportError: Settings cannot be imported, because environment variable Django_SETTINGS_MODULE is undefined.
解決策は簡単です。実際には 十分に文書化されています ですが、簡単に見つけることはできません。 (私はあちこち調べなければなりませんでした-いくつかの異なるGoogle検索を試したとき、それは現れませんでした。)
次のコードが機能します。
>>> 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.'
定義したい設定のいくつかの説明については、(設定するキーワード引数として)Djangoドキュメンテーション(上記リンク))を参照してください。
Jinja2syntax はDjangoとほとんど同じですが、違いはごくわずかです。テンプレートエンジンはバイトコードにコンパイルされます(FAST!)。
Django自体を含む)のテンプレートに使用します。非常に優れています。必要な機能が欠けている場合は、簡単に拡張機能を作成することもできます。
コード生成のデモを次に示します。
>>> 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'
Djangoのテンプレートを使用したい特定の理由はありますか? Jinja と Genshi はどちらも優れていると思います。
本当にしたい場合は、 Django documentation on settings.py
。特に、「設定なしで設定を使用するDjango_SETTINGS_MODULE
"。次のようなものを使用します。
from Django.conf import settings
settings.configure (FOO='bar') # Your settings go here
私もjinja2をお勧めします。 Django
vs. jinja2
には Nice article があります。
Jinjaのドキュメントによると、 Python 3のサポートはまだ実験的です です。したがって、Python 3であり、パフォーマンスが問題にならない場合は、Djangoの組み込みテンプレートエンジンを使用できます。
Django 1.8では、 複数テンプレートエンジン のサポートが導入されました。テンプレートの初期化方法を変更する必要があります。明示的に構成する必要がありますsettings.DEBUG
これは、Djangoが提供するデフォルトのテンプレートエンジンによって使用されます。 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"
助けてくれてありがとう。もう1つ追加します。カスタムテンプレートタグを使用する必要がある場合。
モジュールread.pyにこの重要なテンプレートタグがあるとします
from Django import template
register = template.Library()
@register.filter(name='bracewrap')
def bracewrap(value):
return "{" + value + "}"
これは、htmlテンプレートファイル「temp.html」です。
{{var|bracewrap}}
最後に、ここにPythonすべて一緒に結びつけるスクリプトがあります
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)
出力は次のようになります
{stackoverflow.com rox}
しないでください。代わりに StringTemplate を使用してください。一度知ってしまえば、他のテンプレートエンジンを検討する理由はありません。
他の記述に加えて、Django> 1.7でDjangoテンプレートを使用する場合は、settings.configure(...)にTEMPLATES変数を呼び出し、Django.setup()を呼び出す必要があります。このような :
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()
次に、通常のように、文字列からテンプレートをロードできます。
from Django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Rob'})
t.render(c)
そして、ディスクから.configureにDIRS変数を書き込んだ場合:
from Django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})
Djangoエラー:DjangoTemplatesバックエンドが設定されていません
http://Django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts
manage.py
シェルの実行中:
>>> from Django import template
>>> t = template.Template('My name is {{ me }}.')
>>> c = template.Context({'me': 'ShuJi'})
>>> t.render(c)
Google AppEngine
は、Djangoテンプレートエンジンを使用していますが、どのように実行されているか見てみましたか?それを使用することもできます。
上記の声明を繰り返します。 Jinja 2は、Djangoテンプレートを一般的に使用するための非常に優れたスーパーセットです。彼らは、Django .py、しかしJinjaはあなたのためにうまくいくはずです。