2013-05-08 5 views
18

मेरे तूफान आवेदन http शरीर अनुरोध के माध्यम से पोस्ट डेटा स्वीकार करता हैतूफान request.body

मेरी हैंडलर में मैं अनुरोध

def post(self): 
    data = self.request.body 

डेटा मैं हो रही है प्राप्त करने में सक्षम हूँ str के से (शब्दकोश)

क्या इस डेटा को पायथन शब्दकोश के रूप में प्राप्त करने का कोई तरीका है?

मैं इस स्ट्रिंग को एक पायथन शब्दकोश में कनवर्ट करने के लिए सर्वर पक्ष पर eval का उपयोग नहीं करना चाहता हूं।

+0

यह शायद एक JSON स्ट्रिंग है। – Blender

+0

क्या इस जेसन स्ट्रिंग को पायथन शब्दकोश में eval का उपयोग किए बिना कनवर्ट करने का कोई तरीका है। –

+0

इस जेसन स्ट्रिंग में रिक्त स्थान शामिल हैं जो अन्य जेसन पुस्तकालयों को इसे पाइथन डिक्शनर में मानने के लिए नहीं करते हैं –

उत्तर

16

आपको एक JSON स्ट्रिंग प्राप्त हो रही है। JSON मॉड्यूल

import json 

def post(self): 
    data = json.loads(self.request.body) 

अधिक जानकारी के लिए के साथ यह व्याख्या करना: http://docs.python.org/2/library/json.html

+12

उदाहरण के लिए, आपको मूल बाइट्रिंग को डीकोड करना होगा। 'json.loads (self.request.body.decode ('utf-8'))' –

+1

अब आप 'tornado.escape.json_decode (self.request.body) 'का उपयोग कर सकते हैं जो आपके लिए सभी डिकोडिंग को संभालेगा। –

+0

ध्यान दें कि 'tornado.escape' wrappers का उपयोग 'json.loads'' से है, जिसका अर्थ है कि आप' JSONDecoder' को 'cls' या' parse _.. 'के साथ अनुकूलित/ओवरराइड करने में असमर्थ होंगे। (यह पूरक 'tornado.escape.json.encode' का उपयोग करने के साथ एक मुद्दा है जो' json.dumps' wraps है। लेकिन अभी भी उल्लेख करने लायक है।) – cowbert

1

मुझे लगता है कि मैं एक ऐसी ही मुद्दा था जब मैं तूफान में अनुरोध को पार्स किया गया था। urllib.unquote_plus मॉड्यूल उपयोग करके देखें:

import urllib 
try: 
    import simplejson as json 
except ImportError: 
    import json 


data = json.loads(urllib.unquote_plus(self.request.body)) 

मेरे कोड अनुरोध की दोनों विभिन्न स्वरूपों के लिए तैयार किया जा सकता था, इसलिए मैं कुछ ऐसा किया था:

try: 
    json.loads(self.request.body) 
except: 
    json.loads(urllib.unquote_plus(self.request.body)) 
+0

मैं उत्सुक हूं कि उत्तर क्या था, इसलिए अगर यह मदद करता है तो मुझे बताएं (या यदि आपने इसे चैट में देखा है)। मैं लगभग सकारात्मक हूं कि ऐसा इसलिए था क्योंकि यह यूआरएल-एनकोडेड था। – Mitch

+0

भागने से मुझे यहां मदद मिली। – RandomInsano

+0

पायथन 3 के लिए, यह 'urllib.parse.unquote_plus()' – NuclearPeon

25

Eloim के जवाब के लिए एक विकल्प के रूप में, तूफान प्रदान करता है tornado.escape "एचटीएमएल, जेएसओएन, यूआरएल, और अन्य से बचने" से बचने के लिए "। मुझ में निर्मित httputil
बहु इनपुट (चेकबॉक्स, टेबल, आदि) के साथ अच्छा काम बवंडर में शरीर को पार्स करने के लिए

data = tornado.escape.json_decode(self.request.body) 
-1

सबसे अच्छा तरीका है: यह का उपयोग करके आप देना चाहिए आप क्या चाहते हैं। यदि सबमिट तत्वों के पास मूल्यों की सूची लौटने की सूची में समान नाम है।

कार्य नमूना:

import tornado.httputil  

    def post(self): 
     file_dic = {} 
     arg_dic = {} 

     tornado.httputil.parse_body_arguments('application/x-www-form-urlencoded', self.request.body, arg_dic, file_dic) 

    print(arg_dic, file_dic) # or other code` 
0

आप WebApp2 का उपयोग कर रहे हैं, तो यह अपने आप ही json एक्स्ट्रा कलाकार का उपयोग करता है। (डिकोड) http://webapp2.readthedocs.io/en/latest/_modules/webapp2_extras/json.html

data = json.decode(self.request.body) 
    v = data.get(key) 
    self.response.write(v) 

उदाहरण के लिए मेरी पोस्ट की कुंजी है 'postvalue'

data = json.decode(self.request.body) 
    v = data.get('postvalue') 
    self.response.write(v) 
0

कैसे करें के बारे

bind_args = dict((k,v[-1]) for k, v in self.request.arguments.items()) 
+0

है, जबकि यह कोड प्रश्न का उत्तर दे सकता है, इस समस्या का समाधान कैसे कर सकता है और/या यह हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करने से उत्तर के दीर्घकालिक मूल्य में सुधार होगा। –

संबंधित मुद्दे