Lewati ke isi

Perutean HTTP

Starlette memiliki sistem perutean permintaan yang sederhana namun kuat. Tabel perutean didefinisikan sebagai daftar rute dan dilewati saat aplikasi diaktifkan.

Starlette.application diimpor dari Starlette
Dari pemula. Tanggapan impor PlainTextResponse
Dari starlette. rute impor routing


Sinkronisasi beranda def (permintaan):
    Kembalinya PlainTextResponse ("Beranda")

Sinkronisasi def tentang (permintaan):
    Mengembalikan PlainTextResponse ("Tentang")


Rute = [
    Rute ("/," titik akhir = beranda),
    Rute ("/ tentang," titik akhir = tentang),
]

Aplikasi = Starlette (rute = rute)

endpoint Parameter dapat menjadi salah satu dari berikut:

  • Fungsi reguler atau asinkron yang menerima a request Argumen tunggal, dan harus membalas tanggapan.
  • Kelas yang mengimplementasikan antarmuka ASGI, seperti HTTPEndpoint Starlette.

parameter jalur

Jalur dapat menggunakan gaya template URI untuk menangkap komponen jalur.

Rute ('/ pengguna /{username}', pengguna)

Secara default, ini akan menangkap karakter hingga akhir jalur atau / berikutnya.

Anda dapat menggunakan konverter untuk mengubah konten yang diambil. Konverter yang tersedia adalah:

  • str Mengembalikan string dan merupakan nilai default.
  • int Mengembalikan bilangan bulat Python.
  • float Mengembalikan nomor floating-point Python.
  • uuid mengembalikan contoh uuid.UUID Python.
  • path mengembalikan sisa jalur, termasuk karakter / tambahan.

Konverter digunakan dengan memperbaikinya dengan titik dua, sebagai berikut:

Rute ('/ pengguna /{user_id:int}', pengguna)
Rute ('/ floating-point /{number:float}', floating _ point)
Rute ('/ diunggah /{rest_of_path:path}', diunggah)

Jika Anda memerlukan konverter berbeda yang tidak ditentukan, Anda dapat membuatnya sendiri. Lihat di bawah ini untuk contoh cara membuat konverter datetime dan cara mendaftarkannya:

Dari tanggal waktu data impor

Dari starlette.convertors impor Convertor, register _ url _ convertor


Dikonversi Waktu Kelas (Konvertor):
    Regex = "[0-9]{4}- [0-9]{2}- [0-9]{2}T [0-9]{2}: [0-9]{2}: [0-9]{2}([0-9] +)? "

    Def mengkonversi (diri, nilai: str) - > datetime:
        Mengembalikan datetime.strptime (nilai, "% Y-% m-% dT% H:% M:% S")

    Def to _ string (diri, nilai: datetime) - > str:
        Nilai kembali.strftime ("% Y-% m-% dT% H:% M:% S")

Register _ url _ convertor ("datetime," DateTimeConvertor ())

Setelah mendaftar, Anda akan dapat menggunakannya sebagai:

Rute ('/ sejarah /{date:datetime}', sejarah)

Parameter jalur tersedia dalam permintaan sebagai kamus request.path_params.

Async pengguna def (permintaan):
    user _ id = permintaan. path _ params ['user _ id']
    ...

Menangani metode HTTP

Routing juga dapat menentukan metode HTTP mana yang menangani titik akhir.

Rute ('/ pengguna /{user_id:int}', pengguna, metode = ["DAPATKAN," "POST"])

Secara default, titik akhir fungsi hanya akan menerima permintaan GET, kecuali ditentukan lain.

Kabel pemasangan di bawah dasar

Dalam aplikasi besar, Anda mungkin ingin membagi bagian dari tabel perutean berdasarkan awalan jalur umum.

Rute = [
    Rute ('/', beranda),
    Gunung ('/ pengguna', rute = [
        Rute ('/', pengguna, metode = ['GET', 'POST']),
        Rute ('/{username}', pengguna),
    ])
]

Gaya ini memungkinkan Anda untuk menentukan subset yang berbeda dari tabel perutean di berbagai bagian proyek.

Dari pengguna impor myproject, auth

Rute = [
    Rute ('/', beranda),
    Gunung ('/ pengguna', rute = users.route),
    Gunung ('/ auth', rute = auth.route),
]

Anda juga dapat menggunakan tunggangan untuk menyertakan aplikasi anak dalam aplikasi Starlette Anda. Sebagai contoh...

# Ini adalah server file statis mandiri:
App = StaticFiles (direktori = "statis")

# Ini adalah server file statis yang dipasang dalam aplikasi Starlette,
# di bawah jalur "/ statis."
Rute = [
    ...
    Mount ("/ statis," app = StaticFiles (direktori = "statis"), nama = "statis")
]

Aplikasi = Starlette (rute = rute)

pencarian URL terbalik

Anda biasanya ingin dapat menghasilkan URL untuk rute tertentu, seperti dalam situasi di mana Anda perlu mengembalikan respons pengalihan.

  • Tanda tangan: url_for(name, **path_params) -> URL

    Rute = [Rute ("/," beranda, nama = "beranda") ]

    Kita dapat menggunakan berikut ini untuk mengembalikan URL...

    Url = request.url _ untuk ("Rumah")

Pencarian URL dapat mencakup parameter jalur...

Rute = [
    Rute ("/ pengguna /{username}, "pengguna, nama =" user _ detail ")
]

# Kita dapat menggunakan yang berikut untuk mengembalikan URL...
Url = request. url _ untuk ("user _ detail," nama pengguna =...)

Jika Mount berisi name, maka basa harus menggunakan gaya {prefix}:{name} untuk pencarian URL terbalik.

Rute = [
    Gunung ("/ pengguna," nama = "pengguna," rute = [
        Rute ("/," pengguna, nama = "user _ list"),
        Rute ("/{username}," pengguna, nama = "user _ detail")
    ])
]

# Kita dapat menggunakan berikut ini untuk mengembalikan URL...
Url = request.url _ untuk ("pengguna: user _ list")
Url = request.url _ for ("user: user _ detail," username =...)

Aplikasi yang diinstal mungkin berisi parameter path=....

Rute = [
    ...
    Mount ("/ statis," app = StaticFiles (direktori = "statis"), nama = "statis")
]

# Kita dapat menggunakan berikut ini untuk mengembalikan URL...
Url = request.url _ untuk ("statis," path = "/ css / base.css")

Dengan tidak adanya contoh request, Anda dapat melakukan pencarian terbalik terhadap aplikasi, meskipun pencarian ini hanya akan mengembalikan jalur URL.

Url = app.url _ path _ for ("user _ detail," nama pengguna =...)

perutean berbasis host

Jika Anda ingin menggunakan rute yang berbeda untuk jalur yang sama berdasarkan header Host.

Perhatikan bahwa port dikeluarkan dari header Host bila dicocokkan. Misalnya,Host (host='example.org:3600', ...) ditangani meskipun header Host mengandung atau tidak mengandung port selain 3600(example.org:5600,example.org). Oleh karena itu, jika Anda perlu menggunakan port di url_for, Anda dapat menentukan port tersebut.

Ada beberapa cara untuk menghubungkan perutean berbasis host ke aplikasi Anda

Situs = Router () # Gunakan eg.`@site.route()` untuk mengonfigurasi ini.
API = Router () # Gunakan eg.`@api.route()` untuk mengonfigurasi ini.
Berita = Router () # Gunakan eg.`@news.route()` untuk mengonfigurasi ini.

Rute = [
    Host ('api.example.org', api, name = "site _ api")
]

Aplikasi = Starlette (rute = rute)

app.host ('www.example.org', situs, nama = "main _ site")

Berita _ host = Host ('news.example.org', berita)
App.router.routine append (news _ host)

Kueri URL dapat mencakup parameter host, seperti parameter jalur

Rute = [
    Host ("{subdomain}. example.org," name = "sub," app = Router (route = [
        Gunung ("/ pengguna," nama = "pengguna," rute = [
            Rute ("/," pengguna, nama = "user _ list"),
            Rute ("/{username}," pengguna, nama = "user _ detail")
        ])
    ]))
]
...
Url = request.url _ for ("sub: user: user _ detail," username =..., subdomain =...)
Url = request.url _ for ("sub: user: user _ list," subdomain =...)

prioritas rute

Jalur masuk secara berurutan cocok dengan setiap Route.

Dalam situasi di mana beberapa rute mungkin cocok dengan jalur masuk, Anda harus berhati-hati untuk memastikan bahwa rute yang lebih spesifik tercantum sebelum kasus umum.

Misalnya:

# Jangan lakukan ini:`/users/me` tidak akan pernah cocok dengan permintaan yang masuk.
Rute = [
    Rute ('/ pengguna /{username}', pengguna),
    Rute ('/ pengguna / saya', _ user saat ini),
]

# Lakukan ini:`/users/me` diuji terlebih dahulu.
Rute = [
    Rute ('/ pengguna / saya', _ user saat ini),
    Rute ('/ pengguna /{username}', pengguna),
]

Bekerja dengan instance router

Jika Anda bekerja pada tingkat rendah, Anda mungkin ingin menggunakan instance Router normal daripada membuat aplikasi Starlette. Ini memberi Anda aplikasi ASGI ringan yang hanya menyediakan perutean aplikasi tanpa membungkusnya dengan middleware apa pun.

Aplikasi = Router (rute = [
    Rute ('/', beranda),
    Gunung ('/ pengguna', rute = [
        Rute ('/', pengguna, metode = ['GET', 'POST']),
        Rute ('/{username}', pengguna),
    ])
])

Rute WebSocket

Saat menggunakan titik akhir WebSocket, Anda harus menggunakan WebSocketRoute alih-alih Route biasa.

Parameter jalur dan WebSocketRoute Pencarian URL terbalik bekerja dengan HTTP. Route Demikian pula, ini dapat ditemukan di bagian perutean HTTP di atas.

Starlette.application diimpor dari Starlette
Dari bintang. rute impor WebSocketRoute


Async def websocket _ index (websocket):
    Tunggu websocket.terima ()
    Tunggu websocket. kirim _ teks ("Halo, websocket!")
    Tunggu websocket.close ()


Async def websocket _ user (websocket):
    Nama = websocket. path _ params ["nama"]
    Tunggu websocket.terima ()
    Tunggu websocket send _ text (f "Halo,{name}")
    Tunggu websocket.close ()


Rute = [
    WebSocketRoute ("/," endpoint = websocket _ index),
    WebSocketRoute ("/{name}," titik akhir = websocket _ user),
]

Aplikasi = Starlette (rute = rute)

endpoint Parameter dapat menjadi salah satu dari berikut:

  • Sebuah fungsi asinkron yang menerima parameter websocket tunggal.
  • Kelas yang mengimplementasikan antarmuka ASGI, seperti WebSocketEndpoint Starlette.