Lewati ke isi

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 diunggah str , atau jika tidak tersedia None (Misalnya myimage.jpg ).
  • content_type:str dengan tipe konten (tipe MIME / tipe media), atau None jika tidak tersedia (misalnya image/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: objek Headers. Biasanya ini hanya akan menjadi header Content-Type, tetapi jika header lain dimasukkan dalam bidang multipart, mereka juga akan disertakan di sini. Perhatikan bahwa header ini tidak terkait dengan header dalam Request.headers.
  • size: Sebuah int dari 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 header Content-Length. Jika tidak diatur, itu adalah None.

UploadFile memiliki metode async berikut. Mereka semua menyebut metode file yang sesuai di bawah kap (menggunakan SpooledTemporaryFile internal).

  • async write(data): Tulis data(bytes) ke file.
  • async read(size): membaca size(int) byte dari file.
  • async seek(offset): Pergi ke lokasi byte offset(int) dalam file.
    • Misalnya,await myfile.seek(0) akan pergi ke awal file.
  • 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()