"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > एक ही फास्टएपीआई एंडपॉइंट में फॉर्म और JSON डेटा दोनों को कैसे संभालें?

एक ही फास्टएपीआई एंडपॉइंट में फॉर्म और JSON डेटा दोनों को कैसे संभालें?

2024-11-08 को प्रकाशित
ब्राउज़ करें:845

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

एक फास्टएपीआई एंडपॉइंट कैसे बनाएं जो फॉर्म या जेएसओएन बॉडी को स्वीकार कर सके?

फास्टएपीआई में, आप एक एंडपॉइंट बना सकते हैं जो फॉर्म या जेएसओएन बॉडी को स्वीकार कर सकता है विभिन्न तरीकों का उपयोग करना। यहां कुछ विकल्प दिए गए हैं:

विकल्प 1: एक निर्भरता फ़ंक्शन का उपयोग करना

इस विकल्प में एक निर्भरता फ़ंक्शन बनाना शामिल है जो सामग्री-प्रकार अनुरोध हेडर के मूल्य की जांच करता है और स्टारलेट के तरीकों का उपयोग करके मुख्य भाग को पार्स करता है , तदनुसार।

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

विकल्प 2: अलग-अलग समापन बिंदुओं को परिभाषित करना

दूसरा विकल्प एक एकल समापन बिंदु रखना है, और अपनी फ़ाइल(ओं) और/या फॉर्म डेटा पैरामीटर को वैकल्पिक के रूप में परिभाषित करना है। यदि किसी भी पैरामीटर में मान पास कर दिया गया है, तो इसका मतलब है कि अनुरोध या तो एप्लिकेशन/x-www-form-urlencoded या मल्टीपार्ट/फॉर्म-डेटा था। अन्यथा, यह संभवतः एक JSON अनुरोध था। टाइपिंग से आयात वैकल्पिक, सूची ऐप = फास्टएपीआई() @app.post('/') async def सबमिट (आइटम: वैकल्पिक [सूची [str]] = फॉर्म (कोई नहीं), फ़ाइलें: वैकल्पिक[सूची[अपलोडफ़ाइल]] = फ़ाइल(कोई नहीं)): # यदि फ़ाइलें और/या फॉर्म-डेटा प्राप्त हुआ था यदि आइटम या फ़ाइलें: फ़ाइल नाम = कोई नहीं यदि फ़ाइलें: फ़ाइल नाम = [फ़ाइलों में f के लिए f.फ़ाइल नाम] वापसी {'फ़ाइल(एँ)/फ़ॉर्म-डेटा': {'आइटम': आइटम, 'फ़ाइल नाम': फ़ाइल नाम}} अन्यथा: # जांचें कि क्या JSON डेटा प्राप्त हुआ था डेटा = अनुरोध का इंतजार करें.json() वापसी {'JSON': डेटा}

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}
आने वाले अनुरोध की जांच करने के लिए आप एक मिडलवेयर का भी उपयोग कर सकते हैं और इसे /submitJSON या /submitForm एंडपॉइंट पर फिर से भेज सकते हैं, जो निर्भर करता है अनुरोध की सामग्री-प्रकार पर।

fastapi से आयात करें FastAPI, अनुरोध fastapi.response से JSONResponse आयात करें ऐप = फास्टएपीआई() @app.middleware("http") async def some_middleware(अनुरोध: अनुरोध, कॉल_नेक्स्ट): यदि request.url.path == '/': content_type = request.headers.get('सामग्री-प्रकार') यदि content_type कोई नहीं है: वापसी JSONResponse( सामग्री={'विस्तार': 'कोई सामग्री-प्रकार प्रदान नहीं किया गया!'}, स्टेटस_कोड=400) elif content_type == 'एप्लिकेशन/json': request.scope['path'] = '/submitJSON' elif (content_type == 'application/x-www-form-urlencoded' या content_type.startswith('मल्टीपार्ट/फॉर्म-डेटा')): request.scope['path'] = '/submitForm' अन्य: वापसी JSONResponse( सामग्री={'विस्तार': 'सामग्री-प्रकार समर्थित नहीं!'}, स्टेटस_कोड=400) वापसी प्रतीक्षा कॉल_नेक्स्ट(अनुरोध) @app.post('/') डीईएफ़ मुख्य(): वापस करना @app.post('/submitJSON') def सबमिट_जेसन (आइटम: आइटम): वापसी के लिए वस्तु @app.post('/submitForm') def सबमिट_फॉर्म(संदेश: str = फॉर्म(...), आइटम: सूची[str] = फॉर्म(...), फ़ाइलें: वैकल्पिक[सूची[अपलोडफ़ाइल]] = फ़ाइल(कोई नहीं)): वापसी संदेश

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
आप पायथन की अनुरोध लाइब्रेरी का उपयोग करके उपरोक्त विकल्पों का परीक्षण कर सकते हैं:

आयात अनुरोध यूआरएल = 'http://127.0.0.1:8000/' फ़ाइलें = [('फ़ाइलें', खुला('a.txt', 'rb'))), ('फ़ाइलें', खुला('b.txt', 'rb'))] पेलोड = {'आइटम': ['फू', 'बार'], 'संदेश': 'हैलो!'} # फॉर्म डेटा और फ़ाइलें भेजें आर = अनुरोध.पोस्ट(यूआरएल, डेटा=पेलोड, फ़ाइलें=फ़ाइलें) प्रिंट(आर.टेक्स्ट) # केवल फॉर्म डेटा भेजें आर = अनुरोध.पोस्ट(यूआरएल, डेटा=पेलोड) प्रिंट(आर.टेक्स्ट) # JSON डेटा भेजें आर = अनुरोध.पोस्ट(यूआरएल, जेएसओएन=पेलोड) प्रिंट(आर.टेक्स्ट)

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3