我实际上正在使用烧瓶。 我使用 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")
但我认为还有更直接的方法。
感谢您的帮助。
请注意,我在本示例中使用 JQuery,因为它更简单,并且可以帮助您避免很多压力和跨浏览器问题。
如果您只是像已经做的那样传入错误代码,Werkzeug 会将错误消息包装在 html 中(尽管您仍然可以使用正则表达式在客户端提取错误消息,但这并不灵活)。 所以 No Flask 不会自动将 JSON 字符串返回给客户端
flask
abort
方法要么接受错误代码,要么接受 Response
对象。要实现您想要做的事情,您必须将 Response
对象传递给 abort
方法。
werkzeug.wrappers.Response
对象的包装器
还有一个帮助方法来创建名为 make_response 的响应对象,因此如果您只想创建一个简单的
Response
对象,则不必摆弄 Response
类
您创建
Response
对象而不是允许 render_template
或 abort
为您执行此操作的原因之一是,当您需要向响应添加自定义标头或更改 abort
添加的默认标头时到回复。
应用程序.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
和异常通常是如何处理的。 这将是一个很好的起点