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

标签 javascript python google-chrome flask

我实际上正在使用 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 有一个 abort 函数,但是在阅读文档时,我很难理解它到底做了什么。当我调用我的路线时:

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")

但我认为还有更直接的方法。

感谢您的帮助。

最佳答案

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

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

flask abort 方法要么接受一个错误代码,要么接受一个Response 对象。要实现您想要执行的操作,您必须将 Response 对象传递给 abort 方法。

响应对象是 werkzeug.wrappers.Response 的包装器对象

还有一个辅助方法可以创建名为 make_response 的响应对象因此,如果您只想创建一个简单的Response 对象

,则不必摆弄Response

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

应用.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()

客户端.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

关于javascript - flask.abort() 究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41768866/

相关文章:

JavaScript 变量不会因条件而增加

javascript - 在不更改 url 页面的情况下发送表单

google-chrome - WebSocket Chrome 接收数据问题

google-chrome - chrome.webNavigation.onTabReplaced 不触发

html - 在悬停时更改子项的 CSS 可以在 firefox 或 chrome 中使用

javascript - 为什么字符串中的等号会抛出意外的标记错误?

javascript - javascript语法错误Windows主机行1字符1

python - 如何使用远程分支 pull 、推

python - 重构代码以便使用 3 个值来制作绘图和元组索引必须是整数,而不是 float

Python:无法理解正则表达式