为什么json.dumps()必须在Flask中使用?

时间:2015-12-26 03:45:14

标签: python flask

(这可能是一个愚蠢的问题,所以请穿上你的愚蠢盾牌!)我是一名PHP程序员,现在正在学习Python + Flask。我最近不得不通过AJAX发布数据并返回响应而苦苦挣扎。最后,有效的代码是:

@app.route('/save', methods=['POST'])
def save_subscriptions():
    if request.method == 'POST':
        sites = request.form.get('selected')
        print(sites)
        sites = sites[0:-1]        
        g.cursor.execute('UPDATE users SET sites = %s WHERE email = %s', [sites, session.get('email')])
        g.db.commit()
        return json.dumps({'status': 'success'})

如果我将return json.dumps({'status': 'success'})更改为return 1,我会收到int is not callable的例外情况。首先,我不明白谁试图称之为int,为什么?其次,在PHP中,经常可以只echo 1;,这将成为AJAX响应。那么为什么没有return 1在Flask工作呢?

1 个答案:

答案 0 :(得分:7)

Flask视图is described in the docs应该返回的详细信息:

  

视图函数的返回值自动转换为   一个响应对象。如果返回值是一个字符串   转换为响应对象,字符串作为响应体,a   200 OK错误代码和text / html mimetype。 Flask的逻辑   适用于将返回值转换为响应对象的方式为   如下:

     
      
  • 如果返回了正确类型的响应对象,则直接返回   从视图中返回。

  •   
  • 如果是字符串,则会创建响应对象   使用该数据和默认参数。

  •   
  • 如果返回元组   元组中的项目可以提供额外的信息。这样的元组必须   处于至少有一个项目的形式(响应,状态,标题)   在元组中。状态值将覆盖状态代码和   标头可以是其他标头值的列表或字典。

  •   
  • 如果   这些都不起作用,Flask将假设返回值是有效的WSGI   应用程序并将其转换为响应对象。

  •   

在您的情况下,返回整数1 - Flask应用最后一条规则并尝试将其转换为响应对象并失败。在内部,调用make_response() method,如果是整数,将调用werkzeug.Response类的force_type() method,这最终会在尝试创建BaseResponse类的实例时失败实例化WSGI应用程序:

app_rv = app(environ, start_response)

您的案例中app为整数1