2013-08-06 10 views
10

मैं वर्तमान में एक ऐप के लिए एक आरईएसटी एपीआई लिख रहा हूं जिस पर मैं काम कर रहा हूं। ऐप फ्लास्क का उपयोग कर अजगर में लिखा गया है। मैं निम्नलिखित है:पायथन फ्लास्क और कस्टम क्लाइंट त्रुटि संदेश

try: 
    _profile = profile(
     name=request.json['name'], 
     password=profile.get_salted_password('blablabla'), 
     email=request.json['email'], 
     created_by=1, 
     last_updated_by=1 
    ) 
except AssertionError: 
    abort(400) 

session = DatabaseEngine.getSession() 
session.add(_profile) 
try: 
    session.commit() 
except IntegrityError: 
    abort(400) 

त्रुटि हैंडलर इस तरह दिखता है:

@app.errorhandler(400) 
def not_found(error): 
    return make_response(standard_response(None, 400, 'Bad request'), 400) 

मैं त्रुटि 400 का उपयोग कर रहा दोनों एक SQLAlchemy मॉडल सत्यापनकर्ता और एक अद्वितीय बाधा जब साथ एक समस्या निरूपित करने के लिए डेटाबेस के लिए लेखन और दोनों ही मामलों में निम्न त्रुटि ग्राहक को भेजा जाता है:

{ 
    "data": null, 
    "error": { 
    "msg": "Bad request", 
    "no": 400 
    }, 
    "success": false 
} 

वहाँ एक रास्ता अभी भी बीच में बंद करें उपयोग करने के लिए (400 है) लेकिन किसी भी तरह से त्रुटि भी सेट करें ताकि त्रुटि हैंडलर परिणाम में त्रुटि ऑब्जेक्ट के लिए अतिरिक्त जानकारी जोड़ने का ख्याल रख सके?

मुझे यह पसंद है के साथ लाइन में और अधिक मानेंगे:

{ 
    "data": null, 
    "error": { 
    "msg": "(IntegrityError) duplicate key value violates unique constraint profile_email_key", 
    "no": 400 
    }, 
    "success": false 
} 

उत्तर

6

errorhandler एक अपवाद ले जा सकते हैं और साथ ही टाइप करें:

@app.errorhandler(AssertionError) 
def handle_sqlalchemy_assertion_error(err): 
    return make_response(standard_response(None, 400, err.message), 400) 
+0

यूप, यह वह था जिसे मैं ढूंढ रहा था। क्या "कैच-ऑल" जैसे हैंडलर से जुड़ी त्रुटियों को पकड़ने का कोई तरीका नहीं है, इसलिए मैं इसे क्लाइंट को प्रारूपित और संभाल सकता हूं? – Asken

+1

इसे मिला। '@ app.errorhandler (अपवाद)' – Asken

+0

वह make_response और standard_response मेरे लिए काम नहीं करता है। लेकिन यह करता है: "def handle_sqlalchemy_error (err): err.message लौटें, 400" –

8

आप सीधे बीच में बंद करें में एक कस्टम प्रतिक्रिया डाल सकते हैं() फ़ंक्शन:

abort(make_response("Integrity Error", 400)) 

वैकल्पिक रूप से, आप में रख सकते हैं त्रुटि हैंडलर समारोह

@app.errorhandler(400) 
def not_found(error): 
resp = make_response("Integrity Error", 400) 
return resp 
+0

यह आउटपुट का उत्पादन करने के लिए काम करता है लेकिन ऐसा लगता है कि त्रुटि 400 हैंडलर को नहीं कहा जा रहा है मैं यह करता हूँ। क्या वहां अभी भी समाप्त होने का कोई तरीका है क्योंकि मैं त्रुटि हैंडलर में कुछ लॉगिंग करने की योजना बना रहा था? – Asken

+0

सुनिश्चित करें। मेरा अद्यतन उत्तर – codegeek

+0

हाँ देखें, तब से यह काम नहीं करेगा, मैं वापस आ गया हूं जहां मैंने शुरू किया था, जहां सभी 400 'खराब अनुरोध' के बजाय 'ईमानदारी त्रुटि' होगी। मुझे त्रुटि इंटरफ़ेस टेक्स्ट और ** दोनों को त्रुटि हैंडलर में समाप्त करने की आवश्यकता है। :) – Asken

0

मुझे पता है कि खेल के लिए देर हो चुकी है, लेकिन किसी भी अन्य जो समाधान चाहता है, मेरा नाम @codegeek द्वारा उत्तर पर आधारित है।

मैं अपने ServerResponse.py मॉड्यूल में निम्नलिखित के साथ कुछ इसी तरह पूरा करने में सक्षम था:

def duplicate(message=""): 
    response = make_response() 
    response.status_code = 409 
    response.headers = { 
     "X-Status-Reason" : message or "Duplicate entry" 
    } 
    abort(response) 

तो मैं

ServerResponse.duplicate('Duplicate submission. An article with a similar title already exists.') 

कॉल कर सकते हैं कि यह एक प्रतिक्रिया के लिए जाँच करने के लिए यह मेरे AngularJS अनुप्रयोग में आसान बना देता है स्थिति और X-Status-Reason डिफ़ॉल्ट या अनुकूलित संदेश

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