2012-09-05 15 views
18

abort() या जब त्रुटि वास्तव में हुई, का उपयोग कर फ्लास्क में एक अच्छा त्रुटि हैंडलर है।फ्लास्क - कस्टम abort() कोड कैसे बनाएं?

बोतल प्रलेखन से त्रुटि 404 हैंडलर के लिए एक उदाहरण है:

@app.errorhandler(404) 
def not_found(error): 
    return render_template('404.html'), 404 

तो, मैं कस्टम त्रुटि कोड बनाने की कोशिश की तरह

if False: 
    abort(777) 

@app.errorhandler(777) 
def something_is_wrong(error): 
    return render_template('777.html'), 777 

लेकिन यह काम नहीं करता है और WERKZEUG डिबगर का कहना है : LookupError: 777

मुझे this question मिला जो मुझे लगता है कि मुझे ऐसा करना चाहिए:

if False: 
    return '777 error', 777 

दुर्भाग्य से, कोड ऊपर सफेद स्क्रीन उत्पादन, यहां तक ​​कि WERKZEUG डिबगर बाहर नहीं आती है

मैं जानता हूँ कि मैं बस कर सकते हैं:

if False: 
    return render_template('777.html') 

लेकिन यह कोड क्लीनर अगर कर देगा मैं abort() का उपयोग करता हूं। क्या कस्टम त्रुटि कोड बनाने का कोई तरीका है?

उत्तर

24

संभावित HTTP स्थिति कोड की सूची इंटरनेट असाइन नंबर संख्या प्राधिकरण द्वारा तय की जाती है, ताकि आप एक कस्टम जोड़ नहीं सकें। Werkzeug यह पहचानता है और ब्राउज़र पर एक अर्थहीन कोड भेजने से रोकने की कोशिश करता है। अपनी त्रुटि से मेल खाने वाले किसी व्यक्ति को ढूंढने के लिए list of status codes देखें और उस का उपयोग करें।

संपादित करें: सवाल इस काम में आ सकते हैं के पढ़ने पर निर्भर करता है WERKZEUG/बोतल

import werkzeug.exceptions as ex 
from flask import Flask, abort 

class PaymentRequired(ex.HTTPException): 
    code = 402 
    description = '<p>You will pay for this!</p>' 

abort.mappings[402] = PaymentRequired 

app = Flask(__name__) 

@app.route('/') 
def mainpage(): 
    abort(402) 

@app.errorhandler(402) 
def payme(e): 
    return 'Pay me!' 

app.run() 
+0

धन्यवाद, मैं त्रुटि का उपयोग करता हूं 400 bad_request जब उपयोगकर्ता ने URL में मैन्युअल रूप से गलत मान टाइप किया था (क्योंकि URL में ड्रॉपडाउन सूची से उपयोगकर्ता इनपुट शामिल है)। ** यह काम करता है, लेकिन क्या यह सही है? ** – hrsetyono

+1

शायद, इस बात पर निर्भर करता है कि आप इनपुट से इनकार क्यों कर रहे हैं। यदि आप सुरक्षा कारण से अवरुद्ध कर रहे हैं तो एक और उचित/सामान्य कोड 404 हो सकता है, या यहां तक ​​कि 403 भी हो सकता है। –

+2

402 के बारे में क्या? वह एक werkzeug में अपरिभाषित है लेकिन यह एक वैध होना चाहिए। – Pwnna

10

को स्थिति कोड जोड़ना।

एक विशिष्ट अपवाद के लिए ग्राहक त्रुटि पृष्ठ से निपटने जोड़ने के लिए एक आसान तरीका है, तो आप ऐसा कर सकते हैं:

class MyCustom404(Exception): 
    pass 

@app.errorhandler(404) 
def page_not_found(error): 
    return render_template("errors/404.html"), 404 

@app.errorhandler(MyCustom404) 
def special_page_not_found(error): 
    return render_template("errors/custom_404.html"), 404 

... फिर अपने नए हैंडलर को गति प्रदान जब आप

raise MyCustom404 
साथ इसकी जरूरत

docs here देखें।

4

मेरे मामले में, बोतल == 0.11.1 WERKZEUG == 0.11.10

मैं http स्थिति गर्भपात का उपयोग उदाहरण के लिए कोड 451।

यदि आप कोड के साथ abort() का उपयोग करना चाहते हैं, तो एक int संख्या, जैसे abort (451), पहले आपको कस्टम HTTPException, HTTPException का उप-वर्ग बनाना चाहिए और अपने HTTPException को default_exceptions में जोड़ना चाहिए।

from werkzeug.exceptions import HTTPException, default_exceptions, Aborter 
class UnavailableForLegalReasons(HTTPException): 
    code = 451 
    description = 'BIG BROTHER IS WATCHING YOU' 

default_exceptions[451] = UnavailableForLegalReasons 
abort = Aborter() # don't from flask import abort 

@app.errorhandler(451) 
def uflr(e): 
    return e, 451 

@app.route('/debug') 
def debug(): 
    abort(451) 

फिर जब आप ब्राउज़र में पथ में पहुंचने के लिए, आप देख सकते हैं इस enter image description here

लेकिन http कारण परिच्छेद अज्ञात है,

आप बदल सकते हैं यह

from werkzeug.http import HTTP_STATUS_CODES 
HTTP_STATUS_CODES[451] = 'Unavailable For Legal Reasons' # or even empty 

enter image description here