Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mengendalikan Kedua-dua Borang dan Data JSON dalam Titik Akhir FastAPI Tunggal?

Bagaimana untuk Mengendalikan Kedua-dua Borang dan Data JSON dalam Titik Akhir FastAPI Tunggal?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 23:22:30747semak imbas

How to Handle Both Form and JSON Data in a Single FastAPI Endpoint?

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

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 1: Menggunakan fungsi kebergantungan

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>

Pilihan 3: Menggunakan middleware

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>

Menguji Pilihan

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(&quot;http&quot;)
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!

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