Request
Starlette mencakup kelas Request yang memberi Anda antarmuka yang lebih ramah pengguna untuk menangani permintaan masuk daripada mengakses cakupan ASGI secara langsung dan menerima saluran.
permintaan
Tanda tangan: Request(scope, receive=None)
Dari bintang. permintaan permintaan impor
Tanggapan dari starlette. impor
Async aplikasi def (lingkup, menerima, mengirim):
Tegaskan lingkup ['tipe'] = = 'http'
Permintaan = Permintaan (ruang lingkup, diterima)
**********% s'% (request.method, request.url.path)
Respon = Respon (konten, media _ type = 'text / plain')
Menunggu tanggapan (lingkup, menerima, mengirim)
Permintaan menyediakan antarmuka pemetaan, sehingga Anda dapat menggunakannya seperti yang Anda lakukan dengan scope.
Misalnya,request['path'] akan mengembalikan jalur ASGI.
Jika Anda tidak memerlukan akses ke badan permintaan, Anda dapat mengajukan permintaan tanpa memberikan parameter ke receive.
metode
Metode permintaan diakses sebagai request.method.
Uniform Resource Locators (juga biasa disebut sebagai URL)
URL yang diminta diakses sebagai request.url.
Properti ini adalah objek seperti string yang memaparkan semua komponen yang dapat diuraikan dari URL.
Misalnya:request.url.path,request.url.port,request.url.scheme.
gelar
Header diekspos sebagai multi-kamus yang tidak berubah dan peka huruf besar / kecil.
Misalnya: request.headers['content-type']
parameter permintaan
Parameter kueri diekspos sebagai kamus ganda yang tidak dapat diubah.
Misalnya: request.query_params['search']
parameter jalur
Parameter jalur router diekspos sebagai antarmuka kamus.
Misalnya: request.path_params['username']
Alamat pelanggan
Alamat jarak jauh klien diekspos sebagai biner bernama request.client(atau None).
Nama host atau alamat IP: request.client.host
Nomor port yang terhubung ke klien: request.client.port
Kue
Cookie diberikan dalam bentuk antarmuka kamus reguler.
Misalnya: request.cookies.get('mycookie')
Dalam kasus cookie yang tidak valid, cookie diabaikan. (RFC2109)
tubuh
Ada beberapa antarmuka berbeda untuk mengembalikan isi permintaan:
Badan permintaan dalam bentuk byte: await request.body()
Minta tubuh, diurai sebagai data formulir atau beberapa bagian: async with request.form() as form:
Minta tubuh, diurai sebagai JSON: await request.json()
Anda juga dapat mengakses badan permintaan sebagai aliran menggunakan sintaksis async for:
Dari bintang. permintaan permintaan impor
Tanggapan dari starlette. impor
Async aplikasi def (lingkup, menerima, mengirim):
Tegaskan lingkup ['tipe'] = = 'http'
Permintaan = Permintaan (ruang lingkup, diterima)
Tubuh = b '
Async untuk chunk dalam request.stream ():
Tubuh + = potongan
Respon = Respon (tubuh, media _ type = 'text / plain')
Menunggu tanggapan (lingkup, menerima, mengirim)
Jika Anda mengakses .stream(), potongan byte disediakan tanpa seluruh tubuh disimpan dalam memori. Setiap panggilan berikutnya ke .body(),.form(), atau .json() akan membuat kesalahan.
Dalam beberapa kasus, seperti jajak pendapat yang panjang atau tanggapan streaming, Anda mungkin perlu menentukan apakah pihak klien terputus. Anda dapat menggunakan disconnected = await request.is_disconnected() untuk menentukan status ini.
Meminta file
File permintaan biasanya di kirim sebagai data formulir multi-bagian (multipart/form-data).
Tanda tangan: request.form(max_files=1000, max_fields=1000)
Anda dapat mengonfigurasi jumlah maksimum bidang atau file dengan parameter max_files dan max_fields:
Sinkronisasi dengan request.form (max _ files = 1000, max _ fields = 1000):
...
Informasi!!! , yang menetapkan batas ini untuk alasan keamanan, memungkinkan jumlah bidang atau file yang tidak terbatas yang dapat mengakibatkan Penolakan Layanan Terdistribusi, karena mengurai terlalu banyak bidang kosong dapat menghabiskan banyak CPU dan memori.
Saat Anda menelepon async with request.form() as form, Anda menerima starlette.datastructures.FormData, yang merupakan kamus multi-kamus yang tidak dapat diubah yang berisi unggahan file dan input teks. Item unggahan file direpresentasikan sebagai contoh starlette.datastructures.UploadFile.
UploadFile Memiliki sifat-sifat berikut:
filename: dengan nama file asli yang diunggahstr, atau jika tidak tersediaNone(Misalnyamyimage.jpg).content_type:strdengan tipe konten (tipe MIME / tipe media), atauNonejika tidak tersedia (misalnyaimage/jpeg).file:SpooledTemporaryFile(objek seperti file). Ini adalah file Python yang sebenarnya yang dapat Anda lewati langsung ke fungsi atau perpustakaan lain yang mengharapkan objek "seperti file."headers: objekHeaders. Biasanya ini hanya akan menjadi headerContent-Type, tetapi jika header lain dimasukkan dalam bidang multipart, mereka juga akan disertakan di sini. Perhatikan bahwa header ini tidak terkait dengan header dalamRequest.headers.size: Sebuahintdari ukuran file yang diunggah dalam byte. Nilai ini dihitung berdasarkan isi permintaan dan oleh karena itu merupakan pilihan yang lebih baik untuk menentukan ukuran file yang diunggah daripada headerContent-Length. Jika tidak diatur, itu adalahNone.
UploadFile memiliki metode async berikut. Mereka semua menyebut metode file yang sesuai di bawah kap (menggunakan SpooledTemporaryFile internal).
async write(data): Tulisdata(bytes) ke file.async read(size): membacasize(int) byte dari file.async seek(offset): Pergi ke lokasi byteoffset(int) dalam file.- Misalnya,
await myfile.seek(0)akan pergi ke awal file.
- Misalnya,
async close(): Tutup file.
Karena semua metode ini adalah metode async, Anda harus "menunggu" untuk itu.
Misalnya, Anda dapat memperoleh nama file dan konten dengan:
Sinkronisasi dengan request.form () sebagai bentuk:
Nama file = bentuk ["unggah _ file"]. nama file
Isi = menunggu formulir ["unggah _ file"] .baca ()
Informasi!!! , sebagaimana ditentukan dalam RFC-7578: 4.2, bagian isi data formulir yang berisi file mengasumsikan bahwa ada bidang name dan filename di header Content-Disposition:Content-Disposition: form-data; name="user"; filename="somefile".
Meskipun bidang filename adalah opsional menurut RFC-7578, ini membantu Starlette membedakan data mana yang harus dianggap sebagai file.
Jika bidang filename disediakan, objek UploadFile dibuat untuk mengakses file yang mendasarinya, jika tidak, bagian data formulir diurai dan tersedia sebagai string mentah.
lamaran
Aplikasi Starlette awal dapat diakses melalui request.app.
negara
Jika Anda ingin menyimpan informasi tambahan berdasarkan permintaan, Anda dapat menggunakan request.state untuk melakukannya.
Misalnya:
request.state.time_started = time.time()