اذهب إلى المحتوى

السؤال

نشر (معدل)

أحاول أن أقوم بعمل RESTful API بإستخدام فلاسك Flask، وأحاول أن أستخدم شيء مثل Try .. except على كل التطبيق بحيث إذا حدث خطأ ما في أحد المسارات routes يتم إعادة كود JSON يحتوي على رسالة خطأ بالشكل التالي:

{
  "error":"500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application."
}

وبالتالي لا يتم عرض أي أخطاء في المشروع إلا على شكل JSON

هل يوفر فلاسك Flask طريقة ما لكي يتم معالجة كل الأخطاء في التطبيق بالشكل السابق؟

تم التعديل في بواسطة Mohssen A Mohssen

Recommended Posts

  • 1
نشر

يمكنك تحويل جميع الأخطاء داخل flask إلي دالة تتحكم في شكل ومحتوي الرد أو Response ,

يتم انشاء دالة او Function لهذه المهمة 

@app.errorhandler(Exception)

علي شكل استثناء يظهر في حال الدخول إلي عناوين خاطئة أو حدوث مشكلة جوهرية بأي وظيفة داخل مشروعك,

في البداية ستبني دالة يتم تنفيذها مباشرة عند الاستثناء

@app.errorhandler(Exception)
def handle_error(e):
    try:
        if e.code < 400:
            return flask.Response.force_type(e, flask.request.environ)
        elif e.code == 404:
            return error_Response("Page Not Found", "The page you're looking for was not found")
        raise e
    except:
        return error_Response("Error", "Something went wrong")

ثم دالة اخري تقوم بصياخة الخطأ الذي يتم اظهاره أو ارساله وهي error_Response, يمكنك التحكم في كل ما بها بحسب ما تريد,

def error_Response(code, name):
    error = {'error':{}}
    error['error']['title'] = 'App | {0}'.format(name)
    error['error']['page'] = request.url
    error['error']['name'] = name
    error['error']['code'] = code
    return jsonify(error)

ستبدو رسالة الخطأ كما يلي في حال صفحة خاطئة أو url غير موجود,

Screenshot_405.png.e62f2092eb233016b09ea8bb514ed08a.png

وفيما يلي شكل الخطأ في حال وجود مشكلة في دالة أو وظيفة ما,

Screenshot_406.png.d7799ef0ff8616460579ed4b9a785469.png

لا تنسى إضافة TRAP_HTTP_EXCEPTIONS إلي app.config بالشكل التالي , 

app.config['TRAP_HTTP_EXCEPTIONS']=True

سيبدو دمج الدالتين في مشروع حقيقي بالشكل التالي,,


 

from flask import (Flask, render_template, request, jsonify)
import requests

URL = 'https://mm.com/test'

app = Flask(__name__, template_folder='template')
app.config['TRAP_HTTP_EXCEPTIONS']=True


def error_Response(code, name):
    shortname = name.lower().replace(' ', '_')
    error = {'error':{}}
    error['error']['title'] = 'App | {0}'.format(name)
    error['error']['page'] = request.url
    error['error']['name'] = name
    error['error']['code'] = code
    return jsonify(error)

@app.errorhandler(Exception)
def handle_error(e):
    try:
        if e.code < 400:
            return flask.Response.force_type(e, flask.request.environ)
        elif e.code == 404:
            return error_Response("Page Not Found", "The page you're looking for was not found")
        raise e
    except:
        return error_Response("Error", "Something went wrong")


@app.route('/')
def index():
    return render_template('send_from_ajax.html')
        
        
@app.route('/from_ajax', methods = ['POST'])
def ajax_request():
    req = requests.get(URL).text
    return jsonify(data=req)
    
    
if __name__ == "__main__":
    app.run(debug = True)

 

يمكنك دائما إجراء تغيرات علي دالة error_Response لكي تفسر الخطأ القادم إليك من flask دون الحاجة إلي الوصول لخط التشغيل او command flask ,هذه كانت فقط بذرة,,

بالتوفيق إن شاء الله

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...