Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mencipta Titik Akhir FastAPI yang Menerima Sama ada Borang atau Badan 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:
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>
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>
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>
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
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!