python कस्टम त्रुटि हैंडलर का उपयोग करते समय abort कमांड से त्रुटि संदेश तक पहुंच कैसे प्राप्त करें




http flask (3)

एक पायथन फ्लास्क सर्वर का उपयोग करके, मैं abort कमांड के साथ एक HTTP त्रुटि प्रतिक्रिया फेंकने में सक्षम होना चाहता हूं और एक कस्टम प्रतिक्रिया स्ट्रिंग और शरीर में एक कस्टम संदेश का उपयोग करना चाहता हूँ

@app.errorhandler(400)
def custom400(error):
    response = jsonify({'message': error.message})
    response.status_code = 404
    response.status = 'error.Bad Request'
    return response

abort(400,'{"message":"custom error message to appear in body"}')

लेकिन error.message चर एक खाली स्ट्रिंग के रूप में आता है। मुझे कस्टम त्रुटि हैंडलर के साथ निरस्त फ़ंक्शन के दूसरे चर तक पहुंच प्राप्त करने के तरीके पर प्रलेखन नहीं मिल रहा है


लोग abort() बहुत अधिक पर भरोसा करते हैं। सच्चाई यह है कि त्रुटियों को संभालने के लिए बहुत बेहतर तरीके हैं।

उदाहरण के लिए, आप इस सहायक समारोह को लिख सकते हैं:

def bad_request(message):
    response = jsonify({'message': message})
    response.status_code = 400
    return response

फिर अपने दृश्य फ़ंक्शन से आप एक त्रुटि वापस कर सकते हैं:

@app.route('/')
def index():
    if error_condition:
        return bad_request('message that appears in body')

यदि त्रुटि उस स्थान पर आपके कॉल स्टैक में गहराई से होती है जहां प्रतिक्रिया लौटना संभव नहीं है तो आप एक कस्टम अपवाद का उपयोग कर सकते हैं। उदाहरण के लिए:

class BadRequestError(ValueError):
    pass

@app.errorhandler(BadRequestError)
def bad_request_handler(error):
    return bad_request(error.message)

फिर उस फ़ंक्शन में जो त्रुटि जारी करने की आवश्यकता है, आप केवल अपवाद उठाएं:

def some_function():
    if error_condition:
        raise BadRequestError('message that appears in the body')

आशा है कि ये आपकी मदद करेगा।


यदि आप flask/__init__.py देखते हैं तो आप देखेंगे कि abort वास्तव में werkzeug.exceptions से आयात किया जाता है। Aborter क्लास को देखते हुए, हम देख सकते हैं कि जब संख्यात्मक कोड के साथ बुलाया जाता है, तो विशेष HTTPException subclass को देखा जाता है और Aborter इंस्टेंस को प्रदान किए गए सभी तर्कों के साथ बुलाया जाता है। HTTPException देखते हुए, लाइन 85-89 पर विशेष ध्यान देकर हम देख सकते हैं कि दूसरा तर्क HTTPException.__init__ को पास किया गया है HTTPException.__init__ description संपत्ति में संग्रहीत है, जैसा कि @ डीरन ने बताया।

आप या तो description संपत्ति से संदेश तक पहुंच सकते हैं:

@app.errorhandler(400)
def custom400(error):
    response = jsonify({'message': error.description['message']})
    # etc.

abort(400, {'message': 'custom error message to appear in body'})

या सिर्फ विवरण स्वयं ही पास करें:

@app.errorhandler(400)
def custom400(error):
    response = jsonify({'message': error.description})
    # etc.

abort(400, 'custom error message to appear in body')

मैं बस इसे इस तरह करता हूं:

    abort(400, description="Required parameter is missing")




http-error