コンテンツにスキップ

テンプレート

Starletteは特定のテンプレートエンジンと厳密に結合されていませんが、Jinja 2は優れた選択肢です。

Jinja 2テンプレート

署名: Jinja2Templates(directory, context_processors=None, **env_options)

  • directory -ディレクトリパスを表す文字列、os. Pathlikeまたは文字列またはos.Pathlikeのリスト。
  • context_processors -テンプレートコンテキストに追加する辞書を返す関数のリスト。
  • **env_options -Jinja 2環境に渡される他のキーワードパラメータ。

Starletteは jinja2 を設定する簡単な方法を提供しています。これはおそらくデフォルトで使用したいものです。

Starlette. applicationからStarletteをインポート
from starlette. routing importルート,マウント
starlette. templatingからJinja 2 Templateをインポート
starlette. staticfilesからStaticFilesをインポート


テンプレート=Jinja 2テンプレート(ディレクトリ='テンプレート')

async defホームページ(request):
    return template. TemplateResponse(request,'index.html')

ルート=[
    ルート('/',エンドポイント=ホームページ),
    マウント('/static', StaticFiles(directory='static'),name='static')
]

app=Starlette(デバッグ=True,ルート=ルート)

渡された request インスタンスは、テンプレートコンテキストの一部として含める必要があることに注意してください。

Jinja 2テンプレートコンテキストには url_for 関数が自動的に含まれるため、アプリケーション内で他のページに適切にハイパーリンクできます。

たとえば、HTMLテンプレート内から静的ファイルにリンクすることができます。

<link href="{{ url_for('static', path='/css/bootstrap.min.css') }}" rel="stylesheet" />

カスタムフィルタを使用する場合は、Jinja2Templates の env プロパティを更新する必要があります。

commonmarkインポートcommonmark
starlette. templatingからJinja 2 Templateをインポート

def marked_filter(text):
    returnコモンマーク(テキスト)

テンプレート=Jinja 2テンプレート(ディレクトリ='テンプレート')
template. env.filters['マークされた']=マークされたフィルター

jinja 2. Environmentのカスタムインスタンスを使用します

Starletteは、事前に設定された jinja2.Environment インスタンスも受け入れます。

jinja 2をインポート
starlette. templatingからJinja 2 Templateをインポート

env=jinja 2.環境(.。。)
テンプレート=Jinja 2テンプレート(env=env)

コンテキストプロセッサ

コンテキストプロセッサは、テンプレートコンテキストにマージするための辞書を返す関数です。各関数は、引数 request を1つだけ受け取り、コンテキストに追加する辞書を返す必要があります。

テンプレートプロセッサの一般的なユースケースは、共有変数を使用してテンプレートコンテキストを拡張することです。

インポートタイピング
インポートリクエスト

def app_context(request: Request)->typ ing.Dict[str,typ ing.Any]:
    リターン {'app': request.app}

登録コンテキストテンプレート

コンテキストプロセッサを Jinja2Templates クラスの context_processors パラメータに渡します。

インポートタイピング

インポートリクエスト
starlette. templatingからJinja 2 Templateをインポート

def app_context(request: Request)->typ ing.Dict[str,typ ing.Any]:
    リターン {'app': request.app}

テンプレート=Jinja 2テンプレート(
    ディレクトリ='テンプレート'、コンテキスト_プロセッサ=[アプリ_コンテキスト]
)

!!! コンテキストプロセッサの非同期関数としての情報はサポートされていません。

テストテンプレートの応答

テストクライアントを使用する場合、テンプレート応答には .template プロパティと .context プロパティが含まれます。

starlette. testclientからTestClientをインポート


def test_home page():
    client=TestClient(アプリ)
    response=client. get("/")
    レスポンスをアサートします。ステータスコード==200
    assertresponse.template.name=='index. html'
    response. contextで"request"をアサートする

Jinja 2環境のカスタマイズ

Jinja2Templates は、Jinja 2 Environment でサポートされているすべてのオプションを受け入れます。これにより、Starletteが作成した Environment インスタンスをより制御できるようになります。

Environment で利用可能なオプションのリストについては、ここでJinja 2ドキュメントを確認できます

starlette. templatingからJinja 2 Templateをインポート


テンプレート=Jinja 2テンプレート(ディレクトリ='テンプレート'、自動エスケープ=False、自動リロード=True)

非同期テンプレートレンダリング

Jinja 2は非同期テンプレートレンダリングをサポートしていますが、一般に、データベースルックアップやその他のI/O操作を呼び出すロジックをテンプレートに含めないようにすることをお勧めします。

代わりに、エンドポイントがすべてのI/Oを実行していることを確認することをお勧めします。たとえば、ビュー内のデータベースクエリを厳密に評価し、最終結果をコンテキストに含めます。