2015-12-26 12 views
6

(यह शायद एक बेवकूफ सवाल है, इसलिए कृपया अपनी मूर्खता ढाल पहनें!) मैं एक PHP प्रोग्रामर रहा हूं और अब पाइथन + फ्लास्क सीख रहा हूं। मुझे हाल ही में AJAX के माध्यम से डेटा पोस्ट करने और प्रतिक्रिया लौटने के साथ बहुत संघर्ष करना पड़ा। अंत में, कोड है कि काम किया था:फ्लास्क में json.dumps() जरूरी क्यों है?

@app.route('/save', methods=['POST']) 
def save_subscriptions(): 
    if request.method == 'POST': 
     sites = request.form.get('selected') 
     print(sites) 
     sites = sites[0:-1]   
     g.cursor.execute('UPDATE users SET sites = %s WHERE email = %s', [sites, session.get('email')]) 
     g.db.commit() 
     return json.dumps({'status': 'success'}) 

अगर मैं बदल return json.dumps({'status': 'success'})return 1 को मैं एक अपवाद है कि int is not callable मिलता है। सबसे पहले, मुझे समझ में नहीं आता कि int पर कॉल करने का प्रयास कौन कर रहा है और क्यों? दूसरा, PHP में, यह अक्सर echo 1; पर संभव था और यह AJAX प्रतिक्रिया बन जाएगा। फ्लास्क में return 1 क्यों काम नहीं करता है?

+2

कृपया अपने एसक्यूएल प्रश्नों को स्वच्छ करें! –

+0

@WillSherwood धन्यवाद! मैं कल सोच रहा था कि PHP के तैयार बयानों के बराबर क्या था, लेकिन यह बहुत व्यक्तिगत विचार नहीं था क्योंकि यह एक निजी परियोजना है। मैं इस प्रोटो को बदल दूंगा! – dotslash

+0

@WillSherwood अरे, एक मिनट प्रतीक्षा करें! मैं http://bobby-tables.com/python.html देखता हूं और सोच रहा हूं कि मेरे प्रश्न पहले ही स्वीकृत नहीं हैं या नहीं। मुझे और क्या करने की ज़रूरत है? – dotslash

उत्तर

7

क्या बोतल द्वारा दिया जाना चाहिए के पीछे तर्क विस्तार से is described in the docs देखता है: एक दृश्य के समारोह से

वापसी मान स्वचालित रूप से आप के लिए एक प्रतिक्रिया वस्तु में बदल जाती है। यदि वापसी मान एक स्ट्रिंग है तो प्रतिक्रिया शरीर के रूप में स्ट्रिंग के साथ एक प्रतिक्रिया ऑब्जेक्ट में परिवर्तित हो गया है, 200 ठीक त्रुटि कोड और एक टेक्स्ट/एचटीएमएल माइमटाइप।

  • सही प्रकार की एक प्रतिक्रिया वस्तु यह सीधे दृश्य से लौटे है लौटाया जाता है: तर्क यह है कि बोतल प्रतिक्रिया वस्तुओं में वापसी मान परिवर्तित करने के लिए लागू होता रूप इस प्रकार है।

  • यदि यह एक स्ट्रिंग है, तो प्रतिक्रिया डेटा उस डेटा और डिफ़ॉल्ट पैरामीटर के साथ बनाया गया है।

  • यदि एक ट्यूपल वापस किया जाता है तो टुपल में आइटम अतिरिक्त जानकारी प्रदान कर सकते हैं। इस तरह के tuples फार्म (प्रतिक्रिया, स्थिति, शीर्षलेख) में होना चाहिए जहां कम से कम एक आइटम में टुपल में होना चाहिए। स्थिति मान स्थिति कोड को ओवरराइड करेगा और हेडर अतिरिक्त शीर्षलेख मानों की एक सूची या शब्दकोश हो सकता है। इस बात का कोई भी काम करता है

  • हैं, तो बोतल मान वापसी मान एक मान्य WSGI अनुप्रयोग है और परिवर्तित कि एक प्रतिक्रिया वस्तु में होगा।

आपके मामले में, पूर्णांक 1 दिया जाता है - बोतल पिछले नियम लागू होता है और यह एक प्रतिक्रिया ऑब्जेक्ट में परिवर्तित करने की कोशिश करता है और विफल रहता है। आंतरिक रूप से, make_response() method कहा जाता है, एक पूर्णांक के मामले में, एक werkzeug.Response वर्ग के force_type() method जो अंततः एक BaseResponse वर्ग का उदाहरण बनाकर विफल हो जाएगा जब एक WSGI एप्लिकेशन का दृष्टांत करने की कोशिश कर कहेंगे:

app_rv = app(environ, start_response) 

जहां में app अपने मामला पूर्णांक 1 है।

+0

आह, मूर्ख मुझे! तो मुझे बस इतना करना था कि 'वापसी' 1 "'। धन्यवाद! जैसे ही साइट मुझे अनुमति देता है, यह मेरे उत्तर के रूप में स्वीकार करेगा। – dotslash

+0

और पूर्ण स्पष्टीकरण के लिए धन्यवाद। मुझे पूरी तरह से अलग प्रकाश में वेब ढांचे को देखता है। :-) – dotslash

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