Anda dapat menggunakan penangan HTTP untuk memproses permintaan HTTP secara efisien. Saat suatu fungsi dipanggil, Function Compute menggunakan penangan yang Anda tentukan untuk memproses permintaan tersebut. Topik ini menjelaskan struktur dan karakteristik penangan HTTP dalam Python.
Catatan penggunaan
Sebelum menggunakan penangan HTTP, pastikan Pemicu HTTP telah dikonfigurasi untuk fungsi HTTP Anda. Untuk informasi lebih lanjut, lihat Konfigurasikan Pemicu HTTP yang Memanggil Fungsi dengan Permintaan HTTP.
Tanda tangan untuk penangan HTTP
Tanda tangan penangan HTTP dalam Python mengikuti spesifikasi Python Web Server Gateway Interface (WSGI).
Contoh kode berikut menunjukkan tanda tangan penangan HTTP:
def handler(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, world!</h1>']Pada kode sebelumnya:
handler: Fungsi yang dipanggil untuk menanggapi permintaan HTTP sesuai spesifikasi WSGI. Parameter yang dapat dilewatkan adalah sebagai berikut:environ: Informasi terkait semua permintaan HTTP.start_response: Fungsi yang digunakan untuk mengirim respons HTTP.
start_response('200 OK', [('Content-Type', 'text/html')]): Respons dari fungsi, yang mencakup dua parameter. Parameter pertama menunjukkan kode status HTTP, sedangkan parameter kedua adalah header HTTP yang terdiri dari serangkaian objek daftar Python. Setiap header HTTP merupakan objek tuple Python yang berisi dua string Python.return [b'<h1>Hello, world!</h1>']: Nilai kembalian yang dikirim oleh server ke klien sebagai badan respons HTTP.
Contoh: Implementasikan aplikasi Flask
Kode contoh
Setelah membuat penangan HTTP yang sesuai dengan spesifikasi WSGI, aplikasi berbasis kerangka kerja web seperti Flask dan Django dapat dimigrasikan dengan cepat ke Function Compute. Kode berikut menunjukkan cara menjalankan aplikasi Flask-based hello world di waktu proses Python pada Function Compute.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Web App with Python Flask!'
def handler(environ, start_response):
return app(environ, start_response)Pada kode contoh sebelumnya:
Bagian 1: Kode aplikasi berbasis Flask. Bagian ini dimulai dari
from flask import Flaskhinggareturn 'Web App with Python Flask!'.Bagian 2: Fungsi
handler. Untuk menjalankan aplikasi berbasis kerangka kerja web seperti Flask atau Django di waktu proses Python pada Function Compute, Anda hanya perlu mengimplementasikan fungsihandlersebagaireturn app(environ, start_response).
Before you start
Procedure
Masuk ke Konsol Function Compute. Di panel navigasi sisi kiri, klik Services & Functions.
Di bilah navigasi atas, pilih wilayah. Di halaman Services, klik layanan yang diinginkan.
Di halaman Functions, klik Create Function.
Buat fungsi HTTP dengan lingkungan runtime Python 3. Untuk informasi lebih lanjut, lihat Buat fungsi.
Di halaman Function Details, klik tab Code dan masukkan kode contoh sebelumnya di editor kode. Lalu, pilih . Jalankan
pip install flask -t .di editor kode TERMINAL. Instal pustaka Flask di direktori saat ini dan klik Deploy.Klik Tes Fungsi.
Lihat respons. Jika pesan
Web App with Python Flask!muncul, fungsi berhasil dieksekusi.
Struktur permintaan HTTP (environ)
Struktur permintaan HTTP digunakan untuk menyimpan informasi tentang permintaan HTTP. Struktur ini berupa kamus Python. Tabel berikut menggambarkan parameter umum dalam struktur permintaan. Untuk informasi lebih lanjut, lihat Variabel environ.
Parameter | Tipe | Deskripsi |
REQUEST_METHOD | String | Metode permintaan HTTP, seperti GET atau POST. |
HTTP_Variables | String | Variabel yang sesuai dengan header permintaan HTTP yang diberikan oleh klien. |
CONTENT_TYPE | String | Tipe badan permintaan HTTP. |
CONTENT_LENGTH | String | Panjang badan permintaan HTTP. |
REMOTE_ADDR | String | Alamat IP klien. |
wsgi.input | BytesIO | Badan permintaan HTTP. |
fc.request_uri | String | URL permintaan klien. URL ditentukan oleh Function Compute. |
fc.context | FCContext | Konteks. Konteks ditentukan oleh Function Compute. |
Parameter HTTP_Variables dalam struktur permintaan (environ) adalah header permintaan HTTP di mana key diproses sebagai key="HTTP_"+k.upper().replace("-","_") berdasarkan spesifikasi WSGI. Sebagai contoh, jika header permintaan adalah 'x-Custom-key':'value', parameter HTTP_Variables dalam struktur permintaan direpresentasikan sebagai environ['HTTP_X_CUSTOM_KEY']='value'.
Contoh kode berikut menunjukkan cara mendapatkan struktur permintaan penangan HTTP.
# Metode 1: Pengguna memberikan fungsi. FC memanggil fungsi untuk memproses permintaan dan mengirim balasan.
HELLO_WORLD = b"Hello world!\n"
def handler(environ, start_response):
context = environ['fc.context']
request_uri = environ['fc.request_uri']
for k, v in environ.items():
if k.startswith("HTTP_"):
# Proses header permintaan khusus
pass
# Dapatkan request_body
try:
request_body_size = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
request_body = environ['wsgi.input'].read(request_body_size)
# Dapatkan request_method
request_method = environ['REQUEST_METHOD']
# Dapatkan path_info
path_info = environ['PATH_INFO']
# Dapatkan server_protocol
server_protocol = environ['SERVER_PROTOCOL']
# Dapatkan content_type
try:
content_type = environ['CONTENT_TYPE']
except (KeyError):
content_type = " "
# Dapatkan query_string
try:
query_string = environ['QUERY_STRING']
except (KeyError):
query_string = " "
print ('request_body: {}'.format(request_body))
print ('method: {}\n path: {}\n query_string: {}\n server_protocol: {}\n'.format(request_method, path_info, query_string, server_protocol))
# Lakukan sesuatu di sini
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
# Nilai kembali harus iteratif
return [HELLO_WORLD]Struktur respons HTTP
Struktur respons penangan HTTP mencakup status respons, header respons, dan badan respons. Sebelum aplikasi mengembalikan badan respons, Anda harus memanggil fungsi start_response() untuk mengembalikan nilai status dan headers ke server. Badan respons harus berupa objek iteratif.
start_response adalah callable. Kode berikut memberikan struktur sampel dari start_response. Untuk informasi lebih lanjut tentang start_response, lihat The start_response() Callable.
# Disediakan oleh runtime FC.
# status: string seperti '200 OK' atau '403 FORBIDDEN'
# return: harus berupa write(body_data) callable
def start_response(status, response_headers, exc_info=None):
...Item berikut menggambarkan parameter:
Parameter | Tipe | Deskripsi |
status | String | Status respons HTTP. |
response_headers | Daftar | Header respons HTTP. |
exc_info | Daftar | Informasi pengecualian dalam format tupel yang harus dikembalikan server ke klien. Parameter ini tidak digunakan dalam Function Compute. |
Batasan
Batasan Permintaan
Jika permintaan melebihi salah satu batasan berikut, sistem akan mengembalikan kode status 400 dan kesalahan InvalidArgument.
Bidang
Deskripsi
Kode status HTTP
Kode kesalahan
headers
Total ukuran kunci dan nilai dalam header permintaan tidak boleh melebihi 8 KB.
400
InvalidArgument
path
Total ukuran jalur permintaan dan parameter kueri tidak boleh melebihi 4 KB.
body
Total ukuran badan permintaan panggilan sinkron tidak boleh melebihi 32 MB. Total ukuran badan permintaan panggilan asinkron tidak boleh melebihi 128 KB.
Batasan Respons
Jika respons melebihi salah satu batasan berikut, sistem akan mengembalikan kode status 502 dan kesalahan BadResponse.
Bidang
Deskripsi
Kode status HTTP
Kode kesalahan
headers
Total ukuran kunci dan nilai dalam header respons tidak boleh melebihi 8 KB.
502
BadResponse