Django の残りの部分を使用せずに Django テンプレートを使用するにはどうすればよいですか?
-
01-07-2019 - |
質問
(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 のドキュメント (上にリンク) を参照してください。
他のヒント
神社2 構文 は Django のものとほとんど同じですが、違いはほとんどありません。さらに、より強力なテンプレート エンジンが使用され、テンプレートをバイトコードにコンパイルします (高速!)。
私はこれを 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 のテンプレートを使用する特別な理由はありますか?両方 神社 そして ゲンシ 私の意見では、彼らは優れています。
本当に見たい場合は、 Django のドキュメント settings.py
. 。特に「設定をせずに設定を使用する」セクション DJANGO_SETTINGS_MODULE
」。次のようなものを使用します。
from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
jinja2もおすすめです。があります 素敵な記事 の上 django
対 jinja2
後者を選択する理由について詳しく説明します。
神社の資料によると、 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}
これを見つけました:
やめてください。使用 文字列テンプレート 代わりに、一度他のテンプレート エンジンについて知ってしまえば、それを検討する理由はありません。
他の人が書いたことに加えて、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)
DIRS 変数を .configure にディスクから書き込んだ場合:
from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})
ジャンゴエラー:DjangoTemplates バックエンドが構成されていません
http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts
私は上記の発言を繰り返します。Jinja 2 は、一般的な用途に適した Django テンプレートのスーパーセットです。彼らは Django テンプレートと settings.py の結合を少し減らすことに取り組んでいると思いますが、Jinja はうまくやってくれるはずです。
実行中、 manage.py
シェル:
>>> from django import template
>>> t = template.Template('My name is {{ me }}.')
>>> c = template.Context({'me': 'ShuJi'})
>>> t.render(c)
グーグル AppEngine
は Django テンプレート エンジンを使用していますが、その仕組みを調べましたか?それをそのまま使うこともできるかもしれません。