Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mencipta Titik Akhir FastAPI yang Menerima Sama ada Borang atau Badan JSON?

Bagaimana untuk Mencipta Titik Akhir FastAPI yang Menerima Sama ada Borang atau Badan JSON?

DDD
DDDasal
2024-10-27 06:16:03485semak imbas

How to Create a FastAPI Endpoint That Accepts Either Form or JSON Body?

Bagaimana untuk mencipta titik akhir FastAPI yang boleh menerima sama ada badan Borang atau JSON?

Dalam FastAPI, anda boleh menentukan titik akhir yang mengendalikan pelbagai jenis badan permintaan, seperti JSON atau data borang. Ini membolehkan anda membuat titik akhir yang boleh menerima sama ada format tanpa memerlukan titik akhir yang berasingan.

Untuk mencapainya, anda boleh mengikuti salah satu pendekatan di bawah:

Pilihan 1: Menggunakan fungsi kebergantungan

Anda boleh menggunakan fungsi kebergantungan untuk mengesahkan pengepala Jenis Kandungan permintaan, kemudian menghuraikan kandungan dengan sewajarnya menggunakan kaedah Starlette. Harap maklum bahawa bergantung semata-mata pada pengepala Jenis Kandungan mungkin tidak selalu menjamin kesahihan kandungan permintaan, jadi disyorkan untuk memasukkan pengendalian ralat.

<code class="python">import os, sys
from fastapi import FastAPI, Depends, HTTPException
from starlette.requests import Request
app = FastAPI()

# Generating file
open("./app.txt", "w").write("hello from a file")

async def body_parser(request: Request):
    ct = request.headers.get("Content-Type", "")
    if ct == "application/json":
        try:
            d = await request.json()
            if not isinstance(d, dict):
                raise HTTPException(status_code=400, details={"error":"request body must be a dict"})
            return d
        except JSONDecodeError:
            raise HTTPException(400, "Could not parse request body as JSON")
    elif ct == "multipart/form-data":
        await request.stream()  # this is required for body parsing.
        d = await request.form()
        if not d:
            raise HTTPException(status_code=400, details={"error":"no form parameters found"})
        return d
    else:
        raise HTTPException(405, "Content-Type must be either JSON or multipart/form-data")

@app.post("/", dependencies=[Depends(body_parser)])
async def body_handler(d: dict):
    if "file" in d:
        return {"file": d["file"]}
    return d</code>

Pilihan 2: Menggunakan parameter borang/fail pilihan

Dalam pendekatan ini, anda boleh menentukan parameter borang/fail sebagai pilihan dalam titik akhir anda. Jika mana-mana parameter ini mempunyai nilai, ia menganggap permintaan data borang. Jika tidak, ia mengesahkan badan permintaan sebagai JSON.

<code class="python">from fastapi import FastAPI, Form, File, UploadFile
app = FastAPI()

@app.post("/")
async def file_or_json(
    files: List[UploadFile] = File(None),
    some_data: str = Form(None)
):
    if files:
        return {"files": len(files)}
    return {"data": some_data}</code>

Pilihan 3: Menentukan titik akhir yang berasingan untuk setiap jenis

Anda juga boleh membuat titik akhir yang berasingan, satu untuk JSON dan satu lagi untuk data borang . Menggunakan perisian tengah, anda boleh menyemak pengepala Jenis Kandungan dan halakan semula permintaan ke titik akhir yang sesuai.

<code class="python">from fastapi import FastAPI, Request, Form, File, UploadFile
from fastapi.responses import JSONResponse
app = FastAPI()

@app.middleware("http")
async def middleware(request: Request, call_next):
    ct = request.headers.get("Content-Type", "")
    if ct == "application/json":
        request.scope["path"] = "/json"
    elif ct in ["multipart/form-data", "application/x-www-form-urlencoded"]:
        request.scope["path"] = "/form"
    return await call_next(request)

@app.post("/json")
async def json_endpoint(json_data: dict):
    pass

@app.post("/form")
async def form_endpoint(file: UploadFile = File(...)):
    pass</code>

Pilihan 4: Merujuk jawapan lain untuk pendekatan alternatif

Selain itu, anda boleh temui jawapan ini pada Stack Overflow berguna kerana ia memberikan perspektif yang berbeza untuk mengendalikan kedua-dua JSON dan data borang dalam satu titik akhir:

https://stackoverflow.com/a/67003163/10811840

Pilihan Pengujian 1, 2, & 3

Untuk tujuan ujian, anda boleh menggunakan perpustakaan permintaan:

<code class="python">import requests

url = "http://127.0.0.1:8000"
# for testing Python 3.7 and above use:
# url = "http://localhost:8000"

# form-data request
files = [('files', ('a.txt', open('a.txt', 'rb'), 'text/plain'))]
response = requests.post(url, files=files)
print(response.text)

# JSON request
data = {"some_data": "Hello, world!"}
response = requests.post(url, json=data)
print(response.text)</code>

Pendekatan ini menyediakan kaedah berbeza untuk mencipta titik akhir yang boleh mengendalikan kedua-dua JSON dan borang -data dalam FastAPI. Pilih pendekatan yang paling sesuai dengan keperluan dan kes penggunaan anda.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Titik Akhir FastAPI yang Menerima Sama ada Borang atau Badan JSON?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn