विषय पर बढ़ें

अनुरोध

te शामिल हैं एक Request वर्ग प्रदान करता है कि आप के साथ एक अधिक उपयोगकर्ता के अनुकूल इंटरफ़ेस को संभालने के लिए आने वाले अनुरोधों के बजाय सीधे तक पहुँचने ASGI स्कोप और प्राप्त चैनल.

अनुरोध

हस्ताक्षर: Request(scope, receive=None)

स्टारलेट से। अनुरोध आयात अनुरोध
स्टारलेट से प्रतिक्रियाएं। आयात


Ac def ऐप (गुंजाइश, प्राप्त, भेजें):
    गुंजाइश डालें ['type'] == 'htp'
    अनुरोध = अनुरोध (scope, received)
    सामग्री = '% s% s'% (अनुरोध.विधि, अनुरोध.url.path)
    प्रतिक्रिया = प्रतिक्रिया (सामग्री, मीडिया _ प्रकार = 'पाठ / सादा')
    प्रतिक्रिया की प्रतीक्षा (गुंजाइश, प्राप्त, भेजें)

अनुरोध एक मानचित्रण इंटरफ़ेस प्रदान करता है, इसलिए आप इसका उपयोग कर सकते हैं scope उनका भी उपयोग करें।

उदाहरण के लिए,request['path'] ASGI पथ वापस कर देगा।

यदि आपको अनुरोध निकाय तक पहुंच की आवश्यकता नहीं है, तो आप कर सकते हैं receive यदि पैरामीटर प्रदान किए जाते हैं तो अनुरोध को त्वरित करें।

विधि

अनुरोध विधि है request.method एक यात्रा करें।

यूनिफ़ॉर्म रिसोर्स लोकेटर (जिसे आमतौर पर URL भी कहा जाता है)

अनुरोधित के साथ शुरू होता है request.url एक यात्रा करें।

यह गुण एक स्ट्रिंग जैसी वस्तु है जो उन सभी घटकों को उजागर करती है जिन्हें से पार्स किया जा सकता है।

उदाहरण के लिए:request.url.path,request.url.port,request.url.scheme।

शीर्षक

हेडर को अपरिवर्तनीय, केस-असंवेदनशील बहु-शब्दकोशों के रूप में उजागर किया जाता है।

उदाहरण के लिए: request.headers['content-type']

क्वेरी पैरामीटर

क्वेरी मापदंडों को अपरिवर्तनीय कई शब्दकोशों के रूप में उजागर किया जाता है।

उदाहरण के लिए: request.query_params['search']

पथ पैरामीटर

राउटर पथ मापदंडों को शब्दकोश इंटरफ़ेस के रूप में उजागर किया जाता है।

उदाहरण के लिए: request.path_params['username']

ग्राहक का पता

क्लाइंट का रिमोट एड्रेस बाइनरी नाम के रूप में उजागर होता है request.client (या None )।

होस्टनाम या आईपी पता: request.client.host

पोर्ट नंबर जिससे क्लाइंट कनेक्ट हो रहा है: request.client.port

कुकीज़

कुकीज़ एक नियमित शब्दकोश इंटरफ़ेस के रूप में प्रदान की जाती हैं।

उदाहरण के लिए: request.cookies.get('mycookie')

अमान्य कुकीज़ के मामले में, कुकीज़ को अनदेखा कर दिया जाता है. (RFC2109)

शरीर

अनुरोध के शरीर को वापस करने के लिए कई अलग-अलग इंटरफेस हैं:

अनुरोध निकाय बाइट रूप में है: await request.body()

अनुरोध निकाय, फॉर्म डेटा या कई भागों के रूप में पार्स: async with request.form() as form:

अनुरोध निकाय, JSके रूप में पार्स: await request.json()

आप भी उपयोग कर सकते हैं async for वाक्यविन्यास अनुरोध निकाय को एक धारा के रूप में एक्सेस करता है।

स्टारलेट से। अनुरोध आयात अनुरोध
स्टारलेट से प्रतिक्रियाएं। आयात


Ac def ऐप (गुंजाइश, प्राप्त, भेजें):
    गुंजाइश डालें ['type'] == 'htp'
    अनुरोध = अनुरोध (scope, received)
    शरीर = बी '
    request.stream में चंक के लिए एसिंक ():
        शरीर + = चंक
    प्रतिक्रिया = प्रतिक्रिया (बॉडी, मीडिया_टाइप = 'टेक्स्ट / प्लेन')
    प्रतिक्रिया की प्रतीक्षा (गुंजाइश, प्राप्त, भेजें)

यदि आप यात्रा करते हैं .stream() , बाइट ब्लॉक पूरे शरीर को मेमोरी में संग्रहीत किए बिना प्रदान किए जाते हैं। किसी भी बाद के जोड़े .body() , .form() या .json() सभी कॉल एक त्रुटि बढ़ाएंगे।

कुछ मामलों में, जैसे कि लंबे मतदान या स्ट्रीमिंग प्रतिक्रियाएं, आपको यह निर्धारित करने की आवश्यकता हो सकती है कि क्लाइंट पक्ष डिस्कनेक्ट है या नहीं। आप उपयोग कर सकते हैं disconnected = await request.is_disconnected() इस स्थिति को निर्धारित करें।

अनुरोध फ़ाइल

अनुरोध फ़ाइलों को आमतौर पर मल्टी-पार्ट फॉर्म डेटा (multipart/form-data) के रूप में भेजा जाता है।

हस्ताक्षर: request.form(max_files=1000, max_fields=1000)

आप मापदंडों का उपयोग कर सकते हैं max_files और max_fields फ़ील्ड या फ़ाइलों की अधिकतम संख्या कॉन्फ़िगर करें:

अनुरोध के साथ एसिंक। (max_files = 1000, max_fields = 1000):
    ...

!!! सुरक्षा कारणों से, असीमित संख्या में फ़ील्ड या फ़ाइलों की अनुमति देने से वितरित अस्वीकृत-सेवा हो सकती है, क्योंकि बहुत सारे खाली फ़ील्ड पार्स करने से बहुत अधिक सीपीयू और मेमोरी की खपत होती है।

जब आप फोन करते हैं async with request.form() as form आपको एक प्राप्त होगा starlette.datastructures.FormData , जो एक अपरिवर्तनीय बहु-शब्दकोश है जिसमें फ़ाइल अपलोड और पाठ इनपुट शामिल हैं। फ़ाइल अपलोड आइटम के रूप में दर्शाया गया है starlette.datastructures.UploadFile के उदाहरण।

UploadFile निम्नलिखित गुण हैं:

  • filename : अपलोड किए गए मूल फ़ाइल नाम के साथ str , या यदि उपलब्ध नहीं है None (उदाहरण के लिए myimage.jpg )।
  • content_type : एक सामग्री प्रकार के साथ (MIME type/media type) str या यदि यह उपलब्ध नहीं है (उदा. image/jpeg ) है None ...
  • file : एक SpooledTemporaryFile (एक फ़ाइल जैसी वस्तु)। यह वास्तविक पायथन फ़ाइल है जिसे आप सीधे अन्य कार्यों या पुस्तकालयों में पास कर सकते हैं जो "फ़ाइल जैसे" ऑब्जेक्ट की उम्मीद करते हैं।
  • headers : एक Headers वस्तु। आमतौर पर यह केवल होगा Content-Type हेडर, लेकिन यदि अन्य हेडर एक बहु-भाग क्षेत्र में शामिल हैं, तो वे भी यहां शामिल हैं। ध्यान दें कि ये हेडर से संबंधित हैं Request.headers इसमें सिर कोई फर्क नहीं पड़ता।
  • size : बाइट्स में एक अपलोड फ़ाइल आकार int इस मान की गणना अनुरोध की सामग्री के आधार पर की जाती है, इसलिए अपलोड की गई फ़ाइल का आकार निर्धारित करना बेहतर विकल्प है Content-Length हेडर। यदि सेट नहीं है, तो None ...

UploadFile निम्नलिखित है async विधि। वे सभी हुड के तहत संबंधित फ़ाइल विधि कहते हैं (आंतरिक का उपयोग करके) SpooledTemporaryFile )।

  • async write(data) : होगा data ( bytes फ़ाइल पर लिखें।
  • async read(size) : फ़ाइल पढ़ें size ( int ) बाइट्स।
  • async seek(offset) फ़ाइल में बाइट स्थिति पर जाएं offset ( int ) जगह।
    • उदाहरण के लिए, await myfile.seek(0) फ़ाइल के प्रारंभिक स्थान पर जाएं।
  • async close() : फ़ाइल बंद करें।

चूंकि ये सभी तरीके हैं async विधि, आपको उनके लिए "प्रतीक्षा" करने की आवश्यकता है।

उदाहरण के लिए, आप फ़ाइल नाम और सामग्री प्राप्त कर सकते हैं:

अनुरोध के साथ एसिंक। () फॉर्म के रूप में:
    फ़ाइलनाम = फ़ॉर्म ["upload_file"] .filen
    सामग्री = प्रतीक्षा फॉर्म ["upload_file"] .()

!!! जानकारी, जैसा कि RFC-7578: में निर्दिष्ट है, फ़ाइल के फॉर्म डेटा सामग्री भाग को इसमें निहित माना जाता है Content-Disposition सिर में name और filename फील्ड: Content-Disposition: form-data; name="user"; filename="somefile" हालांकि RFC-7578 के अनुसार, filename फ़ील्ड वैकल्पिक है, लेकिन यह te को यह बताने में मदद करता है कि किस डेटा को फ़ाइल के रूप में माना जाना चाहिए। यदि प्रदान किया गया है filename फील्ड बनाई जाएगी UploadFile अंतर्निहित फ़ाइल तक पहुंचने के लिए ऑब्जेक्ट, अन्यथा फॉर्म डेटा भाग पार्स किया जाएगा और मूल स्ट्रिंग के रूप में उपलब्ध होगा।

आवेदन

शुरुआती te आवेदन के माध्यम से पहुँचा जा सकता है request.app यात्रा।

राज्य

यदि आप अनुरोध पर अतिरिक्त जानकारी संग्रहीत करना चाहते हैं, तो आप उपयोग कर सकते हैं request.state ऐसा करने के लिए।

उदाहरण के लिए:

request.state.time_started = time.time()