Template
Starlette tidak sepenuhnya digabungkan dengan mesin template tertentu, tetapi Jinja2 adalah pilihan yang sangat baik.
Template Jinja2
Tanda tangan: Jinja2Templates(directory, context_processors=None, **env_options)
directorySebuah string, os. Pathlike, atau daftar string atau os. Pathlike mewakili jalur direktori.context_processorsDaftar fungsi yang mengembalikan kamus untuk ditambahkan ke konteks template.**env_options- Argumen kata kunci tambahan diteruskan ke lingkungan Jinja2.
Starlette menyediakan cara mudah untuk melakukan konfigurasi jinja2. Ini mungkin yang ingin Anda gunakan secara default.
Starlette.application diimpor dari Starlette
Dari bintang. rute impor Rute, Gunung
Dari starlette.templating Jinja2 Template impor
Dari starlette.staticfiles impor StaticFiles
Template = Jinja2Template (direktori = 'template')
Sinkronisasi beranda def (permintaan):
Template kembali. TemplateResponse (permintaan, 'index.html')
Rute = [
Rute ('/', titik akhir = beranda),
Gunung ('/ statis', StaticFiles (direktori = 'statis'), nama = 'statis')
]
Aplikasi = Starlette (debug = Benar, rute = rute)
Harap dicatat bahwa contoh request yang masuk harus disertakan sebagai bagian dari konteks template.
Konteks template Jinja2 akan secara otomatis menyertakan fungsi url_for, sehingga kami dapat menautkan ke halaman lain dengan benar di dalam aplikasi.
Misalnya, kita dapat menautkan ke file statis dari dalam template HTML kita:
<link href="{{ url_for('static', path='/css/bootstrap.min.css') }}" rel="stylesheet" />
Jika Anda ingin menggunakan filter khusus, Anda harus memperbarui properti env Jinja2Templates:
Dari biasa impor impor
Dari starlette.templating Jinja2 Template impor
Benar-benar ditandai _ filter (teks):
Kembali biasa (teks)
Template = Jinja2Template (direktori = 'template')
Templates.env.filter ['ditandai'] = ditandai _ filter
Gunakan jinja2 kustom. Contoh lingkungan
Starlette juga menerima contoh jinja2.Environment yang telah dikonfigurasi sebelumnya.
impor jinja2
Dari starlette.templating Jinja2 Template impor
Env = jinja2. Lingkungan (...)
Template = Jinja2 Template (env = env)
pawang konteks
Penangan konteks adalah fungsi yang mengembalikan kamus untuk dimasukkan ke dalam konteks template. Setiap fungsi hanya membutuhkan satu argumen,request, dan harus mengembalikan kamus untuk ditambahkan ke konteks.
Kasus penggunaan umum untuk penangan template adalah memperluas konteks template menggunakan variabel bersama.
Impor mengetik
Dari bintang. permintaan permintaan impor
Aplikasi Def _ konteks (permintaan: Permintaan) - > mengetik. Dict [str, mengetik. Ada]:
Kembali {'app': request.app}
Template konteks pendaftaran
Berikan penangan konteks ke parameter context_processors dari kelas Jinja2Templates.
Impor mengetik
Dari bintang. permintaan permintaan impor
Dari starlette.templating Jinja2 Template impor
Aplikasi Def _ konteks (permintaan: Permintaan) - > mengetik. Dict [str, mengetik. Ada]:
Kembali {'app': request.app}
Template = Jinja2 Template (
Direktori = 'template', konteks _ prosesor = [app _ konteks]
)
!!! Informasi, fungsi asinkron sebagai penangan konteks tidak didukung.
uji respons template
Saat menggunakan sisi klien uji, respons template mencakup atribut .template dan .context.
Dari starlette.testclient impor TestClient
Tes pasti _ beranda ():
Klien = TestClient (aplikasi)
Tanggapan = klien. Dapatkan ("/")
Tegaskan tanggapan. status _ code = = 200
Tegaskan response.template.name = = 'index.html'
Tegaskan "permintaan" dalam tanggapan.konteks
Menyesuaikan lingkungan Jinja2
Jinja2Templates menerima semua opsi yang didukung oleh Jinja2 Environment. Ini akan memungkinkan lebih banyak kontrol atas contoh Environment yang diciptakan oleh Starlette.
Untuk daftar opsi yang tersedia untuk Environment, Anda dapat melihat dokumentasi Jinja2 di sini
Dari starlette.templating Jinja2 Template impor
Template = Jinja2Template (direktori = 'template', autoescape = Salah, auto _ reload = Benar)
rendering template asinkron
Jinja2 mendukung rendering template asynchronous, tetapi secara umum, kami menyarankan Anda untuk menghindari memasukkan logika untuk memanggil pencarian database atau operasi I / O lainnya di template Anda.
Sebaliknya, kami menyarankan Anda untuk memastikan bahwa titik akhir Anda melakukan semua I / O, misalnya, dengan mengevaluasi secara ketat kueri basis data apa pun dalam tampilan dan menyertakan hasil akhir dalam konteksnya.