Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript flask.abort()具体做什么?_Javascript_Python_Google Chrome_Flask - Fatal编程技术网

Javascript flask.abort()具体做什么?

Javascript flask.abort()具体做什么?,javascript,python,google-chrome,flask,Javascript,Python,Google Chrome,Flask,我实际上是在用烧瓶。 我使用flask来运行一个服务器,这将由chrome扩展(js)请求 从扩展请求服务器非常简单:我使用这个方法。该方法还提供了一个回调函数,将JSON对象(来自服务器的响应)作为参数 例如,假设我的服务器上有此路由: @app.route('/users', methods=['POST']) def api_login(): if 'username' not in request.json : return jsonify

我实际上是在用烧瓶。 我使用flask来运行一个服务器,这将由chrome扩展(js)请求

从扩展请求服务器非常简单:我使用这个方法。该方法还提供了一个回调函数,将JSON对象(来自服务器的响应)作为参数

例如,假设我的服务器上有此路由:

@app.route('/users', methods=['POST'])
    def api_login():
        if 'username' not in request.json :
            return jsonify(success=false)
        else :
            return jsonify(success=true)
然后,我可以在扩展中,更准确地说,在回调函数中,检查success值:

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线程的线索之一是使用decorator@app.errorhandler(代码)定义一个特定的错误函数:

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


感谢您的帮助。

请注意,我在本例中使用JQuery是因为它更简单,并且可以避免很多压力和跨浏览器问题

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

flask
abort
方法要么接受错误代码,要么接受
响应
对象。要实现您想要做的事情,您必须将
响应
对象传递给
中止
方法

响应对象是对象周围的包装器

还有一个助手方法可以创建一个名为的响应对象,这样,如果您只想创建一个简单的
响应
对象,就不必去摆弄
响应

创建
Response
对象而不允许
render\u template
abort
为您这样做的原因之一是当您需要向响应添加自定义标题或更改
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>

$.ajax({
网址:'http://localhost:5000/resource',
数据类型:“json”,
成功:功能(数据){
警报(“您的请求成功”);
},
状态代码:{
401:功能(响应){
error=JSON.parse(response.responseText)
警报(错误消息)
}
}
});
通过在
statusCode

您仍然可以通过纯Javascript实现这一点,它只需要更多的击键

您应该仔细阅读werkzeug的源代码,以便更好地了解通常如何处理
abort
和异常

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