Traffine I/O

Bahasa Indonesia

2022-10-03

Memproses Data Form Multipart dengan AWS Chalice

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.py
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.

app.py
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:

app.py
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:

app.py
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.

pp.py
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.

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.

app.py
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.')

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!