flask.abort() 是用来做什么的?

6
我实际上正在使用Flask。
我使用Flask来运行一个服务器,该服务器将由Chrome扩展程序(js)请求。
从扩展程序请求服务器非常简单:我使用chrome.runtime.sendMessage()方法。此方法还提供了一个回调函数,以JSON对象(服务器响应)作为参数。
例如,假设我的服务器上有这个路由:
@app.route('/users', methods=['POST'])
    def api_login():
        if 'username' not in request.json :
            return jsonify(success=false)
        else :
            return jsonify(success=true)

然后,在我的扩展程序中,更准确地说,在回调函数中,我可以检查成功值:
function(response) {
    if(response.success){
        console.log("Login ok !")
    }
}

但现在,我的团队不想再依赖这个了,而是想使用HTTP错误代码。我知道Flask有一个中止函数,但在阅读文档时,我很难理解它到底是做什么的。当我在我的路由中调用时:
else:
    abort(422, {"error":"Missing parameters"})

这段文本的意思是:“我该如何在扩展(js)中使用这些信息?当调用abort函数时,Flask是否会自动返回特定的JSON对象?我该如何检查错误代码?我想在客户端代码中实现这样的操作:”。
if(response.status == 422) {
    console.log("Error")
}

我得到的线索之一是阅读关于abort()的所有StackOverflow帖子,使用装饰器@app.errorhandler(code)定义一个特定的错误函数:
@app.errorhandler(422)
def myErrorCase(error):
    return jsonify(status=422, error="missing parameters")

但我认为有更简单的方法。
谢谢你的帮助。
1个回答

9
请注意,我在这个示例中使用JQuery,因为它更容易,并且可以避免很多压力和跨浏览器问题。
如果你只是像你已经做的一样传递错误代码,Werkzeug将在html中包装错误消息(虽然你仍然可以在客户端使用正则表达式提取错误消息,但这并不是非常灵活的)。所以 Flask 不会自动将 JSON 字符串返回给客户端。
Flask 的 abort 方法接受一个错误代码或者一个 Response 对象。要实现你想要做的事情,你必须将一个 Response 对象传递给 abort 方法。
Response 对象是 werkzeug.wrappers.Response 对象的封装。

还有一个辅助方法可以创建响应对象,称为make_response,因此如果您只想创建简单的Response对象而不想与Response类打交道,那么您就不必这样做。

创建Response对象而不是让render_templateabort为您完成的原因之一是当您需要向响应添加自定义标头或更改abort添加到响应中的默认标头时。

app.py

from flask import Flask, abort, render_template, Response
from json import dumps

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('client.html')

@app.route('/resource')
def resource():
    error_message = dumps({'Message': 'You cannot see this!!!'})
    abort(Response(error_message, 401))

if __name__ == '__main__':
    app.run()

client.html

<html>
  <head>
    <title></title>
    <meta content="">
    <style></style>

    <script
        src="https://code.jquery.com/jquery-3.1.1.min.js"
        integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
        crossorigin="anonymous">
    </script>
  </head>
  <body>

    <script>
    $.ajax({
            url: 'http://localhost:5000/resource',
            dataType: 'json',
            success: function(data){
                alert('Your request was successful');
            },

            statusCode: {
            401: function (response) {
                error = JSON.parse(response.responseText)
                alert(error.Message)

            }
            }
        });
    </script>  
  </body>
</html>

你可以通过在statusCode下定义相应的函数来处理不同的错误代码。 您仍然可以从纯JavaScript中执行此操作,但需要更多的击键。 您应该仔细阅读werkzeug的源代码,以更好地了解如何处理abort和异常。 这将是一个很好的起点

2
具有讽刺意味的是,您链接用于学习异常的页面现在已经出现404错误。我搜索了“werkzeug exceptions.py”(它在该网址中),并在此处找到了一个活动页面:https://github.com/pallets/werkzeug/blob/main/src/werkzeug/exceptions.py - DukeSilver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接