Ana içeriğe geç

Şablonlar

🌐 Translation by AI and humans

This translation was made by AI guided by humans. 🤝

It could have mistakes of misunderstanding the original meaning, or looking unnatural, etc. 🤖

You can improve this translation by helping us guide the AI LLM better.

English version

FastAPI ile istediğiniz herhangi bir template engine'i kullanabilirsiniz.

Yaygın bir tercih, Flask ve diğer araçların da kullandığı Jinja2'dir.

Bunu kolayca yapılandırmak için, doğrudan FastAPI uygulamanızda kullanabileceğiniz yardımcı araçlar vardır (Starlette tarafından sağlanır).

Bağımlılıkları Yükleme

Bir virtual environment oluşturduğunuzdan, etkinleştirdiğinizden ve jinja2'yi yüklediğinizden emin olun:

$ pip install jinja2

---> 100%

Jinja2Templates Kullanımı

  • Jinja2Templates'ı içe aktarın.
  • Daha sonra tekrar kullanabileceğiniz bir templates nesnesi oluşturun.
  • Template döndürecek path operation içinde bir Request parametresi tanımlayın.
  • Oluşturduğunuz templates nesnesini kullanarak bir TemplateResponse render edip döndürün; template'in adını, request nesnesini ve Jinja2 template'i içinde kullanılacak anahtar-değer çiftlerini içeren bir "context" sözlüğünü (dict) iletin.
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")


templates = Jinja2Templates(directory="templates")


@app.get("/items/{id}", response_class=HTMLResponse)
async def read_item(request: Request, id: str):
    return templates.TemplateResponse(
        request=request, name="item.html", context={"id": id}
    )

Not

FastAPI 0.108.0 ve Starlette 0.29.0 öncesinde, ilk parametre name idi.

Ayrıca, daha önceki sürümlerde request nesnesi, Jinja2 için context içindeki anahtar-değer çiftlerinin bir parçası olarak geçirilirdi.

İpucu

response_class=HTMLResponse olarak tanımlarsanız doküman arayüzü (docs UI) response'un HTML olacağını anlayabilir.

Teknik Detaylar

from starlette.templating import Jinja2Templates da kullanabilirsiniz.

FastAPI, geliştirici için kolaylık olması adına starlette.templating içeriğini fastapi.templating olarak da sunar. Ancak mevcut response'ların çoğu doğrudan Starlette'ten gelir. Request ve StaticFiles için de aynı durum geçerlidir.

Template Yazma

Ardından örneğin templates/item.html konumunda bir template yazabilirsiniz:

<html>
<head>
    <title>Item Details</title>
    <link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
</head>
<body>
    <h1><a href="{{ url_for('read_item', id=id) }}">Item ID: {{ id }}</a></h1>
</body>
</html>

Template Context Değerleri

Şu HTML içeriğinde:

Item ID: {{ id }}

...gösterilecek olan id, sizin "context" olarak ilettiğiniz dict içinden alınır:

{"id": id}

Örneğin ID değeri 42 ise, şu şekilde render edilir:

Item ID: 42

Template url_for Argümanları

Template içinde url_for() da kullanabilirsiniz; argüman olarak, path operation function'ınızın kullandığı argümanların aynısını alır.

Dolayısıyla şu bölüm:

<a href="{{ url_for('read_item', id=id) }}">

...path operation function olan read_item(id=id) tarafından handle edilecek URL'nin aynısına bir link üretir.

Örneğin ID değeri 42 ise, şu şekilde render edilir:

<a href="/items/42">

Template'ler ve statik dosyalar

Template içinde url_for() kullanabilir ve örneğin name="static" ile mount ettiğiniz StaticFiles ile birlikte kullanabilirsiniz.

<html>
<head>
    <title>Item Details</title>
    <link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
</head>
<body>
    <h1><a href="{{ url_for('read_item', id=id) }}">Item ID: {{ id }}</a></h1>
</body>
</html>

Bu örnekte, şu şekilde static/styles.css konumundaki bir CSS dosyasına link verir:

h1 {
    color: green;
}

Ve StaticFiles kullandığınız için, bu CSS dosyası FastAPI uygulamanız tarafından /static/styles.css URL'sinde otomatik olarak servis edilir.

Daha fazla detay

Template'leri nasıl test edeceğiniz dahil daha fazla detay için Starlette'in template dokümantasyonuna bakın.