成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 詳解Flask開發(fā)技巧之異常處理

詳解Flask開發(fā)技巧之異常處理

熱門標簽:百度地圖標注位置怎么修改 地圖標注視頻廣告 老人電話機器人 梅州外呼業(yè)務(wù)系統(tǒng) 大連crm外呼系統(tǒng) 北京電信外呼系統(tǒng)靠譜嗎 高德地圖標注是免費的嗎 洪澤縣地圖標注 無錫客服外呼系統(tǒng)一般多少錢

一、Flask內(nèi)置異常處理

要想在Flask中處理好異常,有一套自己的異常處理機制,首先,我們必須先知道Flask自己是如何處理異常的。去flask的源碼里找一找會發(fā)現(xiàn),在flask源碼的app.py文件下,有很多會拋出異常的方法,其中拿一個舉例:

def handle_exception(self, e):
"""Default exception handling that kicks in when an exception
occurs that is not caught.  In debug mode the exception will
be re-raised immediately, otherwise it is logged and the handler
for a 500 internal server error is used.  If no such handler
exists, a default 500 internal server error message is displayed.

.. versionadded:: 0.3
"""
exc_type, exc_value, tb = sys.exc_info()

got_request_exception.send(self, exception=e)
handler = self._find_error_handler(InternalServerError())

if self.propagate_exceptions:
    # if we want to repropagate the exception, we can attempt to
    # raise it with the whole traceback in case we can do that
    # (the function was actually called from the except part)
    # otherwise, we just raise the error again
    if exc_value is e:
        reraise(exc_type, exc_value, tb)
    else:
        raise e

self.log_exception((exc_type, exc_value, tb))
if handler is None:
    return InternalServerError()
return self.finalize_request(handler(e), from_error_handler=True)

我們發(fā)現(xiàn)在flask內(nèi)部對于500異常,會拋出這樣一個錯誤類InternalServerError()

class InternalServerError(HTTPException):

    ......

至此我們發(fā)現(xiàn)flask內(nèi)部異常通過繼承這個HTTPException類來處理,那么這個HTTPException類就是我們研究的重點。

二、HTTPException類分析

@implements_to_string
class HTTPException(Exception):
    """Baseclass for all HTTP exceptions.  This exception can be called as WSGI
    application to render a default error page or you can catch the subclasses
    of it independently and render nicer error messages.
    """

    code = None
    description = None

    def __init__(self, description=None, response=None):
        super(HTTPException, self).__init__()
        if description is not None:
            self.description = description
        self.response = response

    @classmethod
    def wrap(cls, exception, name=None):
        """Create an exception that is a subclass of the calling HTTP
        exception and the ``exception`` argument.

        The first argument to the class will be passed to the
        wrapped ``exception``, the rest to the HTTP exception. If
        ``e.args`` is not empty and ``e.show_exception`` is ``True``,
        the wrapped exception message is added to the HTTP error
        description.

        .. versionchanged:: 0.15.5
            The ``show_exception`` attribute controls whether the
            description includes the wrapped exception message.

        .. versionchanged:: 0.15.0
            The description includes the wrapped exception message.
        """

        class newcls(cls, exception):
            _description = cls.description
            show_exception = False

            def __init__(self, arg=None, *args, **kwargs):
                super(cls, self).__init__(*args, **kwargs)

                if arg is None:
                    exception.__init__(self)
                else:
                    exception.__init__(self, arg)

            @property
            def description(self):
                if self.show_exception:
                    return "{}\n{}: {}".format(
                        self._description, exception.__name__, exception.__str__(self)
                    )

                return self._description

            @description.setter
            def description(self, value):
                self._description = value

        newcls.__module__ = sys._getframe(1).f_globals.get("__name__")
        name = name or cls.__name__ + exception.__name__
        newcls.__name__ = newcls.__qualname__ = name
        return newcls

    @property
    def name(self):
        """The status name."""
        from .http import HTTP_STATUS_CODES

        return HTTP_STATUS_CODES.get(self.code, "Unknown Error")

    def get_description(self, environ=None):
        """Get the description."""
        return u"p>%s/p>" % escape(self.description).replace("\n", "br>")

    def get_body(self, environ=None):
        """Get the HTML body."""
        return text_type(
            (
                u'!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n'
                u"title>%(code)s %(name)s/title>\n"
                u"h1>%(name)s/h1>\n"
                u"%(description)s\n"
            )
            % {
                "code": self.code,
                "name": escape(self.name),
                "description": self.get_description(environ),
            }
        )

    def get_headers(self, environ=None):
        """Get a list of headers."""
        return [("Content-Type", "text/html; charset=utf-8")]

    def get_response(self, environ=None):
        """Get a response object.  If one was passed to the exception
        it's returned directly.

        :param environ: the optional environ for the request.  This
                        can be used to modify the response depending
                        on how the request looked like.
        :return: a :class:`Response` object or a subclass thereof.
        """
        from .wrappers.response import Response

        if self.response is not None:
            return self.response
        if environ is not None:
            environ = _get_environ(environ)
        headers = self.get_headers(environ)
        return Response(self.get_body(environ), self.code, headers)
  • 截取這個類比較重要的幾個方法分析,get_headers方法定義了這個返回的響應(yīng)頭,返回的是html文檔。
  • get_body方法定義了返回的響應(yīng)體,對應(yīng)也是一段html的內(nèi)容。
  • 最后在Response中將響應(yīng)體,狀態(tài)碼,響應(yīng)頭定義好返回。

分析至此,其實這個HTTPException中做的事也不難理解,就是定義好響應(yīng)體,狀態(tài)碼,還有響應(yīng)頭,做了一個返回。當(dāng)然這個類返回是html類型的,現(xiàn)在前后端分離交互都是json形式的返回,所以我們可以繼承自這個類,定義我們自己的異常處理類。

三、自定義異常處理類

首先我們理解我們自己的這個異常處理類,應(yīng)該繼承自HTTPException來改寫。而我們自定義的內(nèi)容應(yīng)該包含以下幾點:

  • 需要定義我們自己想要返回的錯誤信息的json格式,比如內(nèi)部錯誤碼、錯誤信息等我們想記錄的信息。
  • 需要更改返回的響應(yīng)頭,返回json格式的信息響應(yīng)頭就應(yīng)該設(shè)為'Content-Type': 'application/json'
  • 同樣需要和HTTPException一樣定義好狀態(tài)碼

如下定義我們自己的異常類APIException,返回的信息包括內(nèi)部錯誤碼,錯誤信息,請求的url

class APIException(HTTPException):
    code = 500
    msg = 'sorry, we made a mistake!'
    error_code = 999

    def __init__(self, msg=None, code=None, error_code=None, headers=None):
        if code:
            self.code = code
        if error_code:
            self.error_code = error_code
        if msg:
            self.msg = msg
        super(APIException, self).__init__(msg, None)

    def get_body(self, environ=None):
        body = dict(
            msg=self.msg,
            error_code=self.error_code,
            request=request.method + ' ' + self.get_url_no_param()
        )
        text = json.dumps(body)
        return text

    def get_headers(self, environ=None):
        """Get a list of headers."""
        return [('Content-Type', 'application/json')]

    @staticmethod
    def get_url_no_param():
        full_path = str(request.full_path)
        main_path = full_path.split('?')
        return main_path[0]

四、方便的定義自己的錯誤類

有了上面我們改寫好的APIException類,我們就可以自由的定義各種狀態(tài)碼的錯誤以及對應(yīng)的錯誤信息,然后在合適的位置拋出。比如:

class Success(APIException):
    code = 201
    msg = 'ok'
    error_code = 0


class DeleteSuccess(APIException):
    code = 202
    msg = 'delete ok'
    error_code = 1


class UpdateSuccess(APIException):
    code = 200
    msg = 'update ok'
    error_code = 2


class ServerError(APIException):
    code = 500
    msg = 'sorry, we made a mistake!'
    error_code = 999


class ParameterException(APIException):
    code = 400
    msg = 'invalid parameter'
    error_code = 1000


class NotFound(APIException):
    code = 404
    msg = 'the resource are not found'
    error_code = 1001


class AuthFailed(APIException):
    code = 401
    msg = 'authorization failed'
    error_code = 1005


class Forbidden(APIException):
    code = 403
    error_code = 1004
    msg = 'forbidden, not in scope'

有了這些自定義的錯誤類,我們不僅可以直接在需要的地方拋出,而且有了自定義的錯誤碼,發(fā)生錯誤時,只要對照錯誤碼去查找對應(yīng)的錯誤類,非常方便。而且特別說明的是,雖然說是錯誤類,但是也是可以定義響應(yīng)成功的返回的,比如上面定義的200,201的類,同樣可以作為一個成功的返回。

使用演示:

user = User.query.first()
if not user:
    raise NotFound()

五、注意事項

盡管我們可以在我們認為可能出錯的所有地方,繼承自己的異常類,定義自己的錯誤類,然后拋出,但是也不是所有的異常都是我們可以提前預(yù)知的。比如我們接受前端傳來的參數(shù),參數(shù)類型或取值范圍不正確,這些我們可以預(yù)知并處理好,但是如果是邏輯處理中出現(xiàn)了問題,這些不是我們程序員可以控制并處理。所以光有自定義錯誤類還不夠,我們還需要在全局捕獲異常來判斷,利用AOP思想。

# 全局錯誤AOP處理
@app.errorhandler(Exception)
def framework_error(e):
    api_logger.error("error info: %s" % e) # 對錯誤進行日志記錄
    if isinstance(e, APIException):
        return e
    if isinstance(e, HTTPException):
        code = e.code
        msg = e.description
        error_code = 1007
        return APIException(msg, code, error_code)
    else:
        if not app.config['DEBUG']:
            return ServerError()
        else:
            return e

這里對于flask中拋出的所有的錯誤進行捕獲,然后先進行日志的記錄。然后判斷如果是我們自定義的APIException,就直接返回。如果不是我們自定義的,但是是flask處理的HTTPException,包裝成我們自定義的APIException再返回。如果都不是的話,說明是服務(wù)器出現(xiàn)的其他錯誤,問題一般出在我們的代碼上,在生產(chǎn)環(huán)境下,一般統(tǒng)一返回一個500錯誤,在調(diào)試模式下,可以原樣返回,便于我們定位修改自己的代碼。

以上就是詳解Flask開發(fā)技巧之異常處理的詳細內(nèi)容,更多關(guān)于Flask異常處理的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Flask框架學(xué)習(xí)筆記之消息提示與異常處理操作詳解
  • flask中主動拋出異常及統(tǒng)一異常處理代碼示例
  • 利用python實現(xiàn)后端寫網(wǎng)頁(flask框架)
  • 如何創(chuàng)建一個Flask項目并進行簡單配置
  • flask開啟多線程的具體方法
  • 如何解決flask修改靜態(tài)資源后緩存文件不能及時更改問題
  • 詳解Flask前后端分離項目案例
  • 基于python和flask實現(xiàn)http接口過程解析
  • Python Flask微信小程序登錄流程及登錄api實現(xiàn)代碼
  • Python flask框架實現(xiàn)查詢數(shù)據(jù)庫并顯示數(shù)據(jù)

標簽:長春 岳陽 泉州 安慶 清遠 吉林 怒江 洛陽

巨人網(wǎng)絡(luò)通訊聲明:本文標題《詳解Flask開發(fā)技巧之異常處理》,本文關(guān)鍵詞  詳解,Flask,開發(fā),技巧,之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解Flask開發(fā)技巧之異常處理》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解Flask開發(fā)技巧之異常處理的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    freexxx性亚洲精品| 福利一区福利二区| 国产成人精品实拍在线| 久久香蕉视频网站| 日韩av电影一区| 亚洲小说区图片区都市| www.色播.com| 日韩中文在线中文网三级| 亚洲图片欧美视频| 中文字幕色网站| 你懂的在线观看网站| 五月天精品在线| 路边理发店露脸熟妇泻火| 蜜桃在线一区二区三区| 忘忧草在线www成人影院| 国产精品乱看| 一区二区在线不卡| 狂野欧美性猛交xxxx巴西| 99热.com| 精品国产乱码久久久久久蜜柚| 高清欧美精品xxxxx| 中文字幕一区久久| √天堂资源在线| 久久精品偷拍视频| xvideos亚洲人网站| 开心色怡人综合网站| 调教视频在线观看| 伊是香蕉大人久久| 国产特级淫片高清视频| 久久精品夜夜夜夜久久| 亚洲精品乱码久久久久久蜜桃欧美| 人体久久天天| 另类亚洲自拍| 国产欧美综合在线| 日本一级淫片色费放| 亚洲男人天堂视频| 日本高清一区| 在线日本欧美| 草莓视频末满18勿| 国产原创在线观看| 成人av电影在线网| 欧美日韩国产综合久久| 岛国精品一区| 国产又粗又黄视频| 欧美高清日韩| 韩国三级电影一区二区| 一本大道综合伊人精品热热| 久草在线在线视频| 国产精品99久久久久久久久久久久| 国产午夜在线观看| 国产在线不卡一区二区三区| 亚洲女同性videos| 日韩成人动漫| 成人爽a毛片一区二区免费| 1313精品午夜理伦电影| 日本午夜精品一区二区三区电影| 色婷婷视频在线观看| 一区二区三区四区在线观看视频| 成人激情电影一区二区| 亚洲一级二级三级在线免费观看| 99成人免费视频| 亚洲最大成人综合| 视频区 图片区 小说区| 欧美videosex性极品hd| 亚洲成人动漫一区| 天天综合网在线观看| 欧美成人直播| 99热在线免费观看| 美日韩在线观看| 九九在线免费视频| 久久精品中文字幕一区二区三区| 久久综合九色综合久99| 激情欧美一区二区三区| 免费看欧美美女黄的网站| 福利视频网站| 成人av一级片| 电影一区中文字幕| 91精品视频免费在线观看| 欧美日韩中文字幕一区| 精品日本一区二区三区| 天堂av在线8| 91牛牛免费视频| 伊人天天综合| 日韩视频在线观看视频| 被男人吃奶添下面好舒服动态图| 永久免费网站在线| 欧美孕妇与黑人孕交| 亚洲曰本av电影| 欧美裸体一区二区三区| 成人av一级片| 日本欧洲国产一区二区| 在线看无码的免费网站| 亚洲夫妻av| 非洲黑人最猛性xxxx交| 久久九九国产精品怡红院| 中文字幕精品一区二区三区精品| 四虎成人在线视频| 精灵使的剑舞无删减版在线观看| 蘑菇福利视频一区播放| 青青操视频在线观看| 制服丝袜亚洲精品中文字幕| 日韩一区二区三区四区在线| 色婷婷一区二区三区av免费看| 日本免费高清一区| 欧美大奶一区二区| 成人短视频在线观看免费| www.日本在线播放| 国产一区 二区 三区一级| 啪啪av大全导航福利网址| www.欧美精品| 午夜精品久久久久久久99热影院| 国产成人久久精品77777| 天天干在线观看| 免费观看一级特黄欧美大片| 琪琪五月天综合婷婷| 久久这里只有精品视频首页| 欧美日韩p片| 水蜜桃免费高清视频在线播放| 国产小视频在线| 毛片网站网址| 另类视频在线观看+1080p| 成人精品一区二区| 日韩av电影资源网| 日本大片在线看黄a∨免费| a级免费在线观看| 精品日本视频| 国产情侣一区| 国产精品久久婷婷六月丁香| 中文在线视频| 人妻精品久久久久中文字幕69| 性欧美猛交videos| 久久老女人爱爱| 国产尤物一区二区| 极品白嫩少妇无套内谢| 久久久一区二区三区不卡| 色久优优欧美色久优优| 三级网站免费看| 在线不卡日本v二区707| 久久精品视频免费播放| 亚洲激情中文在线| 亚洲线精品一区二区三区| 欧美乱妇15p| 黄色免费看网站| 精品日韩一区二区三区| 免费国产黄色片| 成人免费视频免费观看| 日韩视频在线直播| 精品国产乱子伦一区二区| 亚洲精品在线免费看| 呦视频在线一区二区三区| 中文字幕国产高清| 在线视频中文亚洲| 黄页网址大全免费观看| 日本特黄a级片| 黄网免费视频| 国产麻豆剧传媒精品国产| 亚洲国产岛国毛片在线| 亚洲欧美在线免费| 国产精品伦一区二区三区视频| 亚洲无在线观看| 天天操天天碰| 亚洲精品视频在线观看视频| 尤物在线精品| 丝袜脚交免费网站xx| 免费福利影院| 日本二区视频| 日韩少妇一区二区| 欧美久久影院| 中文字幕av在线播放| 污黄色在线观看| 欧美高清hd18日本| 91小视频在线播放| 久久香蕉频线观| 精品人妻一区二区三区视频| 精品九九在线| 仙踪林久久久久久久999| 大肉大捧一进一出好爽动态图| 日韩av在线播放资源| 九色视频一区| 正在播放国产一区| 一级黄色录像免费看| 综合激情五月婷婷| 欧美喷水视频| 国产精品老熟女一区二区| 黄色www视频| 中文字幕无码精品亚洲资源网久久| 欧美日本一区二区高清播放视频| 欧美日韩一区二区三区四区不卡| 日本高清免费在线视频| 91精选福利| 羞羞视频在线观看| 国产日产欧美精品| 福利精品一区| 污污视频网站在线免费观看| 久久久久久久久久久久久久久| 在线天堂中文字幕| 色一情一乱一伦一区二区三欧美| 黄色成人91| 视频精品一区二区| 一本大道熟女人妻中文字幕在线| 精品无人乱码一区二区三区| 少妇网站在线观看| 色妞色视频一区二区三区四区| 男人的天堂在线视频| 欧美另类videosbestsex日本| 性xxxxfreexxxxx欧美丶| 久久久人成影片免费观看| 无码av免费一区二区三区试看| 狠狠鲁男人天堂| 免费观看一级欧美片| 日韩av一区二区三区美女毛片| 一级片视频免费观看| 91精品久久香蕉国产线看观看| 最近中文字幕免费观看| 天干夜天天夜天干天ww| 国产欧美日韩综合一区在线播放| 青草草在线视频| 99re8这里有精品热视频免费| 色www免费视频| 黑人精品欧美一区二区蜜桃| 欧美女王vk| 色先锋久久av资源部| 亚洲一区二区电影| 538任你躁在线精品视频网站| 欧美日韩喷水| 成人毛片在线精品国产| 色在线视频播放| 91视频免费观看网站| jizz在线免费播放| 91情侣偷在线精品国产| 少妇性l交大片| 久久香蕉国产线看观看av| 欧美国产激情二区三区| 欧美成人精品福利| 国产亚洲精品中文字幕| 欧美精品久久久久久久久久| 精品无人区一区二区三区| 97国产在线| 欧美韩国日本精品一区二区三区| 热久久这里只有| 日本黑人久久| 亚洲精品乱码久久久久久蜜桃图片| 一级片在线观看视频| 国产精品成人av久久| 欧美一区二区三区思思人| 狠狠干婷婷色| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美3p视频在线观看| 婷婷久久一区| 成年人黄色大片在线| 欧美日韩一区二区高清| 成人动漫av在线| 少妇精品无码一区二区三区| 国产一区二区在线观看免费播放| 黄网页免费在线观看| 免费看污污视频| 伊人精品在线视频| 亚洲一区 在线播放| 麻豆福利视频| 2020欧美日韩在线视频| 自拍偷拍一区二区三区四区| 日韩av免费在线| 夜夜躁狠狠躁日日躁av| 伊人精品在线| 精品肉辣文txt下载| 日韩精品午夜视频| 日本电影二区| 国产欧美二区| 伊人久久久久久久久久久久| 成人福利免费在线观看| jizzjizzjizzjizz日本| 成年人免费高清视频| 国产校园另类小说区| 国产成人短视频| 中文字幕乱码人妻二区三区| 久久国产黄色片| 欧美日韩中文字幕一区二区| 国产精品亚洲lv粉色| 色噜噜夜夜夜综合网| 欧美日韩国产探花| 欧美freesextv| 人妻有码中文字幕| 国产白嫩美女无套久久| 亚洲视频免费播放| 茄子视频成人在线观看| 伊人国产在线观看| 亚洲第一视频在线| 日本在线不卡一区二区| 国产精品久久久久久久久免费看| 午夜久久久久久久久久| 久久久久久免费网| 全亚洲第一av番号网站| 欧美调教在线| 香蕉久久视频| 一区二区免费播放| 日韩国产欧美在线观看| 亚洲三区在线观看无套内射| 91一区二区三区四区| 国产精品视频一区二区久久| 国外成人免费在线播放| 男女18免费网站视频| 欧美在线一区二区三区| 波多野结衣视频播放| 亚洲中文字幕在线观看| 欧美18一19xxx性| 久久蜜桃资源一区二区老牛| 欧美mv和日韩mv的网站| 精品极品三级久久久久| 国产精品一卡二卡| 中国一级特黄毛片大片| 26uuu国产电影一区二区| 久久69国产一区二区蜜臀| 亚洲中文字幕一区| 国产精品久久久久久9999| 俄罗斯精品一区二区三区| 日韩免费一区二区三区在线播放| 欧美日韩一区二区三区四区不卡| 成人午夜私人影院| 黄页在线观看视频| 女人在下体塞跳蛋在线观看| 国产欧美丝袜| 久久狠狠久久综合桃花| 久热精品视频在线播放| 欧美一区二区三区不卡视频| 亚欧精品视频一区二区三区| 欧美激情免费看| 99在线免费观看视频| 精品国产999久久久免费|