2012-09-27 12 views
25

के साथ रिटर्निंग एपीआई त्रुटि संदेश मैं पाइथन और फ्लास्क का उपयोग कर एक विश्वसनीय एपीआई डिजाइन कर रहा हूं। जैसा कि अपेक्षित है, एपीआई को एक एपीआई अनुरोध प्राप्त करने और डेटा वापस करने की आवश्यकता है यदि सभी ठीक हो जाए, लेकिन किसी त्रुटि के उदाहरण में, इसे धीरे-धीरे विफल होने और उचित त्रुटि वापस करने की आवश्यकता है। जब मैं त्रुटि परिणाम देता हूं तो आम तौर पर अपवाद उठाता हूं, लेकिन इस मामले में मुझे उपयोगकर्ता को त्रुटि संदेश वापस करने की आवश्यकता है (कोशिश-पकड़ ब्लॉक?)।पाइथन और फ्लास्क

जिस तरह से मैं वर्तमान में त्रुटियों से निपट रहा हूं वह है कि मेरे कार्य डेटा और त्रुटि दोनों को वापस कर दें, और प्रत्येक स्तर पर डेटा की जांच करें, अंत में या तो एपीआई फ़ंक्शन के कॉलर को डेटा या त्रुटि लौटाएं ।

समस्या यह है कि फ़ंक्शन कॉल के कई स्तर होने पर यह बोझिल हो सकता है, मेरे कार्यों को डेटा और त्रुटियों को कई बार पास करने और प्रत्येक बार जांच करने की आवश्यकता होती है।

क्या ऐसा करने का कोई बेहतर तरीका है? त्रुटि सुधार को और अधिक सरल और सुरुचिपूर्ण बनाने के लिए मैं कुछ सुधार क्या कर सकता हूं?

def get_data() 
    data1, error = get_some_data() # function not shown 
    if data1 is None: 
     return None, "could not retrieve data1" 
    data2, error = get_some_other_data() # function not shown 
    if data2 is None: 
     return None, "could not retrieve data2" 
    return (data1, data2), None 

@app.route("/api/method", methods=['GET']) 
def method(): 
    data, error = get_data() 
    if data is None: 
     if error is None: 
      error = "unknown error" 
     return json.dumps({ "error": error }), 500 
    return json.dumps({ "data": data }), 200 
+0

क्यों आप अपवाद का उपयोग नहीं करते? – georg

+0

क्योंकि वह जेसन प्रारूप में उचित संदेश के बिना आंतरिक सर्वर त्रुटि लौटाएगा। फेसबुक एपीआई शैली सोचो। – Ryan

+0

मैं @ thg435 से सहमत हूं। मुझे लगता है कि एक कोशिश ... छोड़कर अपनी "विधि" को थोड़ा सा साफ कर देगा। आप बस अपने त्रुटि हैंडलिंग ब्लॉक को "छोड़कर" ब्लॉक में ले जाएंगे और फिर भी त्रुटि संदेश वापस कर सकते हैं। इस तरह मैं Django में अजाक्स कॉल के साथ ऐसा करता हूं। इसके अलावा, मुझे फ्लास्क के साथ कोई अनुभव नहीं है, लेकिन अगर यह एक विश्वसनीय (आईएसएच) एपीआई है। और ऐसा प्रतीत होता है क्योंकि आप "GET" जा रहे हैं, आपको उचित स्थिति कोड वापस करना चाहिए। 200 अगर चीजें ठीक हैं। या एक 4XX या 500 (अंतर्निहित समस्या क्या है इसके आधार पर)। –

उत्तर

21

आप abort(http_code) का उपयोग ग्राहक के लिए एक उपयुक्त http कोड वापस जाने के लिए कर सकता है या सिर्फ एक गैर- http अपवाद बढ़ा:

यहाँ जिस तरह से मैं वर्तमान में त्रुटियां लौटाने कर रहा हूँ का एक उदाहरण है। और http त्रुटियों और मनमाने ढंग से अपवादों के लिए एक कस्टम हैंडलर प्रदान करने के लिए @app.errorhandler() सजावट का उपयोग करें। आप एक सामान्य प्रयास/ब्लॉक को छोड़कर भी उपयोग कर सकते हैं जहां आप अपवाद को संभालने के लिए तैयार हैं। पाइथन नहीं जाना है आप अपवादों का उपयोग कर सकते हैं।

+0

मुझे गैर-http अपवाद प्लस @ app.errorhandler() विचार बढ़ाना पसंद है। मैं फ्लास्क दस्तावेज़ीकरण में इसे देखने जा रहा हूं और फिर देखता हूं कि यह कितना अच्छा काम करता है। – Ryan

+0

यह दृष्टिकोण बहुत अच्छा काम किया। धन्यवाद! – Ryan

+0

+1 - 'त्रुटिरोधक' और 'फेंकने के अपवाद वास्तव में सही उत्तर –

1

शायद Flask API आपकी आवश्यकताओं के लिए अधिक उपयुक्त है, क्योंकि यह विशेष रूप से रीस्टफुल एपीआई के लिए डिज़ाइन किया गया है।

यह बोतल की तुलना में बेहतर अपवाद हैंडलिंग है, देखें: http://www.flaskapi.org/api-guide/exceptions/