Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mengendalikan Kedua-dua Borang dan Data JSON dalam Titik Akhir FastAPI Tunggal?
Dalam FastAPI, anda boleh mencipta titik akhir yang boleh menerima sama ada borang atau badan JSON menggunakan kaedah yang berbeza. Berikut ialah beberapa pilihan:
Pilihan ini melibatkan mencipta fungsi kebergantungan yang menyemak nilai pengepala permintaan Jenis Kandungan dan menghuraikan kandungan menggunakan kaedah Starlette . Jika mana-mana parameter mempunyai nilai yang dihantar kepada mereka, ini bermakna permintaan itu sama ada application/x-www-form-urlencoded atau multipart/form-data. Jika tidak, ia berkemungkinan permintaan JSON.
<code class="python">from fastapi import FastAPI, Depends, Request from starlette.datastructures import FormData app = FastAPI() async def get_body(request: Request): content_type = request.headers.get('Content-Type') if content_type is None: raise HTTPException(status_code=400, detail='No Content-Type provided!') elif content_type == 'application/json': return await request.json() elif (content_type == 'application/x-www-form-urlencoded' or content_type.startswith('multipart/form-data')): try: return await request.form() except Exception: raise HTTPException(status_code=400, detail='Invalid Form data') else: raise HTTPException(status_code=400, detail='Content-Type not supported!') @app.post('/') def main(body = Depends(get_body)): if isinstance(body, dict): # if JSON data received return body elif isinstance(body, FormData): # if Form/File data received msg = body.get('msg') items = body.getlist('items') return msg</code>
Anda juga boleh menggunakan middleware untuk menyemak permintaan masuk dan mengubah hala ke sama ada /submitJSON atau / submitForm endpoint, bergantung pada Content-Type permintaan.
<code class="python">from fastapi import FastAPI, UploadFile, File, Form from typing import Optional, List app = FastAPI() @app.post('/') async def submit(items: Optional[List[str]] = Form(None), files: Optional[List[UploadFile]] = File(None)): # if File(s) and/or form-data were received if items or files: filenames = None if files: filenames = [f.filename for f in files] return {'File(s)/form-data': {'items': items, 'filenames': filenames}} else: # check if JSON data were received data = await request.json() return {'JSON': data}</code>
Anda boleh menguji pilihan di atas menggunakan pustaka permintaan Python:
<code class="python">from fastapi import FastAPI, Request from fastapi.responses import JSONResponse app = FastAPI() @app.middleware("http") async def some_middleware(request: Request, call_next): if request.url.path == '/': content_type = request.headers.get('Content-Type') if content_type is None: return JSONResponse( content={'detail': 'No Content-Type provided!'}, status_code=400) elif content_type == 'application/json': request.scope['path'] = '/submitJSON' elif (content_type == 'application/x-www-form-urlencoded' or content_type.startswith('multipart/form-data')): request.scope['path'] = '/submitForm' else: return JSONResponse( content={'detail': 'Content-Type not supported!'}, status_code=400) return await call_next(request) @app.post('/') def main(): return @app.post('/submitJSON') def submit_json(item: Item): return item @app.post('/submitForm') def submit_form(msg: str = Form(...), items: List[str] = Form(...), files: Optional[List[UploadFile]] = File(None)): return msg</code>
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Kedua-dua Borang dan Data JSON dalam Titik Akhir FastAPI Tunggal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!