पायथन में POST और GET चर को कैसे संभाला जाता है?


135

PHP में आप केवल $_POSTPOST के लिए और $_GETGET (Query string) वेरिएबल्स के लिए उपयोग कर सकते हैं । पायथन में क्या समान है?


क्या आप CGI स्क्रिप्ट, mod_python, या Django (या अन्य फ्रेमवर्क) एप्लिकेशन लिख रहे हैं? जवाब थोड़ा और जानकारी पर टिका है ...
रोब

क्या आप इनमें से प्रत्येक के लिए नमूना कोड प्रदान कर सकते हैं?
अपवोट

2
CGI, mod_python, Django, CherryPy और Pylons कोड नमूने नहीं हैं। वे पायथन वेब फ्रेमवर्क हैं जो GET और POST को संभालते हैं। जानकारी के लिए wiki.python.org/moin/WebFrameworks देखें । आपका प्रश्न - जैसा पूछा गया - उत्तर नहीं दिया जा सकता।
S.Lott

जवाबों:


246

मान लें कि आप इसके साथ एक html फॉर्म पोस्ट कर रहे हैं:

<input type="text" name="username">

यदि कच्ची cgi का उपयोग कर रहे हैं :

import cgi
form = cgi.FieldStorage()
print form["username"]

यदि Django , Pylons , फ्लास्क या पिरामिड का उपयोग कर रहे हैं :

print request.GET['username'] # for GET form method
print request.POST['username'] # for POST form method

का उपयोग करते हुए TurboGears , Cherrypy :

from cherrypy import request
print request.params['username']

Web.py :

form = web.input()
print form.username

वर्कर्ज़ग :

print request.form['username']

यदि चेरी या टर्बोगियर्स का उपयोग कर रहे हैं, तो आप अपने हैंडलर फ़ंक्शन को सीधे पैरामीटर लेते हुए भी परिभाषित कर सकते हैं:

def index(self, username):
    print username

Google ऐप इंजन :

class SomeHandler(webapp2.RequestHandler):
    def post(self):
        name = self.request.get('username') # this will get the value from the field named username
        self.response.write(name) # this will write on the document

तो आपको वास्तव में उन रूपरेखाओं में से एक को चुनना होगा।


18
का उपयोग कर import cgi, यह नहीं है print form["username"].value?
जे। काट्ज़विंकल

मैं वह उपयोग Bottleकर रहा हूं जो मेरा मानना ​​है कि उपयोग करता है wsgi, क्या कोई उस परिदृश्य में उपयोग करने के लिए बराबर पोस्ट कर सकता है? उपरोक्त प्रतिक्रिया स्पष्ट स्पष्टीकरण है जो मैं भर में आया हूं, इसमें सिर्फ मेरा परिदृश्य शामिल नहीं है।
user1063287

2
FieldStorage python3 में टूट गया है, आप इसके साथ मुद्दों का अनुभव कर सकते हैं। Bugs.python.org/issue6234
NuclearPeon

2
मुझे अपनी पिछली टिप्पणी पर स्पष्ट करने की अनुमति दें; यह पृष्ठ: lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode इसे बेहतर बताता है। एन्कोडिंग समस्याओं के कारण अजगर 3 में FieldStorage () का उपयोग न करें।
न्यूक्लियरपॉन

फ्लास्क के लिए यह थोड़ा अलग है: request.args.get ('उपयोगकर्ता नाम')
Damjan Pavlica

35

मैं जानता हूं कि यह एक पुराना सवाल है। फिर भी यह आश्चर्य की बात है कि कोई अच्छा जवाब नहीं दिया गया।

सबसे पहले सवाल फ्रेमवर्क का उल्लेख किए बिना पूरी तरह से मान्य है। संपर्क एक PHP भाषा तुल्यता है। यद्यपि पायथन में क्वेरी स्ट्रिंग मापदंडों को प्राप्त करने के कई तरीके हैं, फ्रेमवर्क चर केवल सुविधाजनक रूप से आबादी वाले हैं। PHP में, $_GETऔर $_POSTसुविधा चर भी हैं। उन्हें क्रमशः QUERY_URI और php: // इनपुट से पार्स किया जाता है।

पायथन में, ये कार्य होंगे os.getenv('QUERY_STRING')और sys.stdin.read()। ओएस और एसईएस मॉड्यूल आयात करने के लिए याद रखें।

हमें यहां "सीजीआई" शब्द के साथ सावधान रहना होगा, खासकर जब दो भाषाओं और उनकी सामान्यताओं के बारे में बात करते हुए जब एक वेब सर्वर के साथ इंटरफेस होता है। 1. CGI, एक प्रोटोकॉल के रूप में, HTTP प्रोटोकॉल में डेटा ट्रांसपोर्ट मैकेनिज्म को परिभाषित करता है। 2. अजगर को अपाचे में सीजीआई-स्क्रिप्ट के रूप में चलाने के लिए कॉन्फ़िगर किया जा सकता है। 3. पायथन में CGI मॉड्यूल कुछ सुविधा कार्य प्रदान करता है।

चूंकि HTTP प्रोटोकॉल भाषा-स्वतंत्र है, और Apache का CGI एक्सटेंशन भी भाषा-स्वतंत्र है, इसलिए GET और POST पैरामीटर प्राप्त करना भाषाओं में केवल सिंटैक्स अंतर को सहन करना चाहिए।

यहाँ एक पायदान शब्दकोश को आबाद करने के लिए पायथन दिनचर्या है:

GET={}
args=os.getenv("QUERY_STRING").split('&')

for arg in args: 
    t=arg.split('=')
    if len(t)>1: k,v=arg.split('='); GET[k]=v

और पोस्ट के लिए:

POST={}
args=sys.stdin.read().split('&')

for arg in args: 
    t=arg.split('=')
    if len(t)>1: k, v=arg.split('='); POST[k]=v

अब आप निम्न के रूप में खेतों तक पहुँच सकते हैं:

print GET.get('user_id')
print POST.get('user_name')

मुझे यह भी बताना चाहिए कि CGI मॉड्यूल अच्छी तरह से काम नहीं करता है। इस HTTP अनुरोध पर विचार करें:

POST / test.py?user_id=6

user_name=Bob&age=30

उपयोग करने CGI.FieldStorage().getvalue('user_id')से अशक्त सूचक अपवाद हो जाएगा क्योंकि मॉड्यूल नेत्रहीन POST डेटा की जांच करता है, इस तथ्य की अनदेखी करते हुए कि POST अनुरोध GET मापदंडों को भी ले जा सकता है।


मुझे यह त्रुटि मिली: 2.7 के साथ AttributeError: 'NoneType' object has no attribute 'split'प्रयोगCGIPython
कैंडलजैक

1
त्रुटि के बारे में @candlejack ने कहा, इस तरह के तर्क प्राप्त करने का प्रयास करें POST.get('user_name', 'default_value')
जॉर्ज सिगुरोग्लगू

@GeorgeSiggouroglou 'default_value' चीज़ ने मेरी समस्या हल कर दी। धन्यवाद!
umbe1987

1
निश्चित रूप से मेरा पसंदीदा उत्तर अब तक! +1
umbe1987

QUERY_STRING मैक पर एक वैध सूचकांक नहीं है
सैमुअल ईव

31

मुझे nosklo का उत्तर बहुत व्यापक और उपयोगी लगा है! उन लोगों के लिए, जो अपने आप की तरह, जो कच्चे अनुरोध डेटा को सीधे उपयोगी भी पा सकते हैं, मैं ऐसा करने का तरीका जोड़ना चाहूंगा:

import os, sys

# the query string, which contains the raw GET data
# (For example, for http://example.com/myscript.py?a=b&c=d&e
# this is "a=b&c=d&e")
os.getenv("QUERY_STRING")

# the raw POST data
sys.stdin.read()

मैं एक cgi फ़ाइल में एक विधि को कॉल करने की कोशिश कर रहा हूं । एक उदाहरण url है http://www.myserver.com/cgi-bin/cgi.py/ThisIsMyMethod। निम्नलिखित पर्यावरण चर संबंधित हैं: os.environ.get('PATH_INFO')जिसे विधि नाम मिलता है (जैसे: / ThisIsMyMethod) और os.environ.get('SCRIPT_NAME')जो वेब होस्ट के रूट फ़ोल्डर से स्क्रिप्ट को रास्ता प्रदान करता है (जैसे: /cgi-bin/cgi.py)। मेरे मामले में, QUERY_STRING रिक्त है, क्योंकि मैं POST का उपयोग कर रहा हूं।
न्यूक्लियरपॉन

28

वे CGI फ़ील्डस्टोर ऑब्जेक्ट में संग्रहीत हैं।

import cgi
form = cgi.FieldStorage()

print "The user entered %s" % form.getvalue("uservalue")

2
-1। उपयोग किए गए परिवादों / रूपरेखा के आधार पर अनुरोध वस्तु के काफी कुछ प्रतिनिधित्व हैं।
ब्रूनो डिस्टहिलियर्स

10
मुझे यकीन नहीं है कि आपने -1 क्यों किया। मेरा मतलब है, मैंने क्या काम दिया। शायद वह एक ढांचे का उपयोग करने में असमर्थ है। भी, ज्यादातर चौखटे सिर्फ पृष्ठभूमि में इसका इस्तेमाल नहीं करते हैं?
इवान फॉसमार्क

4
करने के लिए बेवकूफ था -1, मैंने इसे संतुलित करने के लिए +1 किया है, साथ ही मुझे लगता है कि यह सबसे अच्छी विधि है क्योंकि यह स्टिंग लौटाता है (जो कि इसके लिए कहा जाता है)
joedborg

1
@Liam यकीन नहीं है कि आपको कोई नहीं मिल रहा है, लेकिन यह पोस्ट 6 साल से अधिक पुरानी है, इसलिए मुझे संदेह नहीं होगा कि अगर चीजें बदल गई हैं।
इवान फॉसमार्क

@EvanFosmark मुझे इसका उपयोग करके कोई भी मान नहीं मिल रहा है। जब मैं प्रिंट वैल्यू cgi.FeildStorage से लौटाता हूं, तो यह वही है जो आउटपुट फील्डस्टोरेज (कोई नहीं, कोई नहीं, []) है। मैंने यहां एक पूर्ण प्रश्न पोस्ट किया है stackoverflow.com/questions/38024516/… किसी भी मदद की सराहना की जाएगी।
चोर सिपाही

1

यह कुछ हद तक इस बात पर निर्भर करता है कि आप सीजीआई ढांचे के रूप में क्या उपयोग करते हैं, लेकिन वे कार्यक्रम के लिए सुलभ शब्दकोशों में उपलब्ध हैं। मैं आपको डॉक्स की ओर इशारा करता हूं, लेकिन मैं अभी python.org से नहीं मिल रहा हूं। लेकिन mail.python.org पर यह नोट आपको पहला पॉइंटर देगा । अधिक के लिए CGI और URLLIB पायथन के लिबास देखें।

अपडेट करें

ठीक है, उस लिंक का भंडाफोड़ हुआ। यहाँ मूल wsgi रेफरी है


यदि आप लिंक का अनुसरण करने के लिए पर्याप्त महत्वाकांक्षी नहीं हैं, तो मैं लिंक से कट और पेस्ट करने के लिए पर्याप्त महत्वाकांक्षी नहीं हूं।
चार्ली मार्टिन

1
और अब लिंक मर चुका है और इसीलिए हर कोई इस तरह से जवाबों से नफरत करता है और उन्हें नीचा दिखाता है। बधाई हो।
जॉन टायर्री 19

2
तुम्हें पता है, हर बार मैं किसी को कुतिया से एक टिप्पणी मिलती है कि एक पांच - लगभग छह साल पुराने जवाब में अब एक टूटी हुई कड़ी है, बिना कहे, एक प्रतिस्थापन लिंक जोड़कर, मैं शर्त लगा सकता हूं कि यह प्रतिनिधि के साथ कोई है <1000.
चार्ली मार्टिन

अगर मुझे पता था कि प्रतिस्थापन लिंक के लिए कहां जाना है (संकेत, मैंने नहीं किया क्योंकि आपका लिंक काम नहीं करता था) मैं इस प्रश्न को नहीं देख रहा हूं।
जॉन टायर्री

आप हमेशा 'CGI और URLLIB python libs' के बारे में संकेत दे सकते हैं।
चार्ली मार्टिन

0

पायथन केवल एक भाषा है, GET और POST डेटा प्राप्त करने के लिए, आपको पायथन में लिखा गया एक वेब फ्रेमवर्क या टूलकिट चाहिए। Django एक है, जैसा कि चार्ली बताते हैं, cgi और urllib मानक मॉड्यूल अन्य हैं। इसके अलावा उपलब्ध टर्बोगियर्स, पाइलन्स, चेरीपी, वेबहोम, mod_python, fastcgi, इत्यादि हैं।

Django में, आपके व्यू फ़ंक्शंस में एक अनुरोध तर्क मिलता है जिसमें request.GET और request.POST होता है। अन्य ढांचे इसे अलग तरीके से करेंगे।


13
"GET और POST डेटा प्राप्त करने के लिए, आपको पायथन में लिखा गया एक वेब फ्रेमवर्क या टूलकिट चाहिए" - बस सच नहीं है
जेम्स टॉमसिनो

2
मैं जेम्स से सहमत हूं, अगर वे पायथन में लिखे गए हैं तो उन्हें स्पष्ट रूप से आपकी अपनी पसंद के लिए फिर से लिखा जा सकता है।
रॉबिन सैंडस्ट्रॉम

ठीक है, मैं अजगर में एक नया कामरेड हूं और मुझे लगा कि यह संभव नहीं हो सकता कि मुझे एक फ्रेमवर्क का उपयोग करना होगा। मेरा सवाल यह है कि क्या तरीका है? मैं किसी भी ढांचे का उपयोग नहीं कर रहा हूं और मेरे पास अपाचे 2 एक अजगर स्क्रिप्ट की सेवा है। Php में $ _GET या $ _POST के उपयोग के रूप में एक मृत सरल तरीका दिखाना अच्छा होगा।
काली इंद्री

1
@JamesTomasino प्रश्न के संदर्भ में, यह सच है।
पेटेर - मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.