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
requestArgumen 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:
strMengembalikan string dan merupakan nilai default.intMengembalikan bilangan bulat Python.floatMengembalikan nomor floating-point Python.uuidmengembalikan contohuuid.UUIDPython.pathmengembalikan 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) -> URLRute = [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
websockettunggal. - Kelas yang mengimplementasikan antarmuka ASGI, seperti WebSocketEndpoint Starlette.