flask.abort()究竟做了什么?

时间:2017-01-20 17:04:12

标签: javascript python google-chrome 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错误代码。我知道烧瓶具有中止功能,但在阅读文档时,我很难理解它的真正作用。当我打电话到我的路线时:

else:
    abort(422, {"error":"Missing parameters"})

如何在扩展名(js)上使用这些信息?在调用abort时,flask会自动返回特定的JSON对象吗?如何查看错误代码?我想在客户端代码中做类似的事情:

if(response.status == 422) {
    console.log("Error")
}

我有一个线索,读取关于abort()的所有StackOverflow线程是使用装饰器@ app.errorhandler(代码)定义一个特定的错误函数:

@app.errorhandler(422)
def myErrorCase(error):
    return jsonify(status=422, error="missing parameters")

但我认为有更简单的方法。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

请注意,我在这个示例中使用了JQuery,因为它更容易,并且可以避免许多压力和跨浏览器问题。

如果您只是传递错误代码,就像您已经在做的那样,Werkzeug将错误消息包装在html中(尽管您仍然可以使用正则表达式在客户端提取错误消息,但这不是很灵活) 。 所以No Flask不会自动将JSON字符串返回给客户端

烧瓶abort方法接受错误代码或者它可以接受Response对象。要实现您想要的目标,您必须将Response对象传递给abort方法。

响应对象是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和异常通常如何处理。 This would be a good starting point