Pengantar
Dalam artikel ini, saya akan membahas cara menerima dan memproses multipart/form-data
dengan AWS Chalice, termasuk menangani permintaan yang masuk, mengurai data, dan mengekstrak file dan field formulir.
Membuat Rute untuk Pengiriman Formulir
Pertama, buat rute baru di file app.py
untuk menangani pengiriman formulir. Rute ini akan mendengarkan permintaan POST
dan menerima konten dengan tipe multipart/form-data
:
app = Chalice(app_name='my_chalice_app')
@app.route('/submit-form', methods=['POST'], content_types=['multipart/form-data'])
def submit_form():
pass
Menggunakan Perpustakaan CGI untuk Mengurai Data Multipart
Selanjutnya, Anda perlu memodifikasi fungsi submit_form()
untuk mengurai data multipart formulir masuk menggunakan perpustakaan CGI. Untuk melakukannya, Anda harus membuat sebuah instance FieldStorage
dan memasukkan app.current_request.raw_body
dan tipe konten permintaan.
from io import BytesIO
def submit_form():
content_type = app.current_request.headers['content-type']
content_length = int(app.current_request.headers['content-length'])
raw_body = app.current_request.raw_body
environ = {
'REQUEST_METHOD': 'POST',
'CONTENT_TYPE': content_type,
'CONTENT_LENGTH': content_length,
'wsgi.input': BytesIO(raw_body),
}
form_data = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ, keep_blank_values=True)
Mengekstrak Data dan File Formulir
Setelah data formulir diurai, Anda dapat mengakses field dan file yang dikirim menggunakan objek form_data
. Misalnya, Anda dapat mengambil nilai dari field teks bernama description
seperti ini:
description = form_data.getvalue('description')
Untuk mengakses file yang diunggah, Anda dapat menggunakan sintaks form_data['file_field']
. Misalnya, untuk mengambil file yang diunggah dengan nama field file, Anda dapat menggunakan kode berikut:
uploaded_file = form_data['file']
filename = uploaded_file.filename
file_content = uploaded_file.file.read()
Menangani Kesalahan dan Validasi
Untuk memastikan bahwa aplikasi Anda menangani kesalahan dan kasus-kasus ekstrem dengan benar, Anda harus memvalidasi data formulir masuk sebelum memprosesnya. Misalnya, Anda dapat memeriksa apakah field yang diperlukan hilang atau jika ukuran file melebihi batas tertentu.
def validate_form_data(form_data):
if 'description' not in form_data:
raise BadRequestError('Missing description field.')
if 'file' not in form_data:
raise BadRequestError('Missing file field.')
if len(form_data['file'].file.read()) > MAX_FILE_SIZE:
raise BadRequestError('File size exceeds the allowed limit.')
def submit_form():
# ... (previous code)
validate_form_data(form_data)
Jangan lupa untuk menentukan konstanta MAX_FILE_SIZE
dengan nilai yang tepat di awal file app.py
.
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10 MB
Dengan mengikuti langkah-langkah ini, Anda akan dapat menerima dan memproses data form multipart menggunakan AWS Chalice dan perpustakaan CGI.
Kode Lengkap
Berikut adalah kode lengkapnya.
import cgi
import json
from io import BytesIO
from chalice import Chalice, BadRequestError
app = Chalice(app_name='my_chalice_app')
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10 MB
@app.route('/submit-form', methods=['POST'], content_types=['multipart/form-data'])
def submit_form():
content_type = app.current_request.headers['content-type']
content_length = int(app.current_request.headers['content-length'])
raw_body = app.current_request.raw_body
environ = {
'REQUEST_METHOD': 'POST',
'CONTENT_TYPE': content_type,
'CONTENT_LENGTH': content_length,
'wsgi.input': BytesIO(raw_body),
}
form_data = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ, keep_blank_values=True)
validate_form_data(form_data)
description = form_data.getvalue('description')
uploaded_file = form_data['file']
filename = uploaded_file.filename
file_content = uploaded_file.file.read()
# Process and handle the form data and uploaded file as needed
# ...
return {'status': 'success'}
def validate_form_data(form_data):
if 'description' not in form_data:
raise BadRequestError('Missing description field.')
if 'file' not in form_data:
raise BadRequestError('Missing file field.')
if len(form_data['file'].file.read()) > MAX_FILE_SIZE:
raise BadRequestError('File size exceeds the allowed limit.')