Flask JSON请求为None

时间:2016-01-15 16:15:02

标签: python json flask

我正在开发我的第一个Flask应用程序(版本0.10.1),以及我的第一个Python(版本3.5)应用程序。其中一件需要像这样工作:

  1. 提交表格
  2. 运行Celery任务(进行一些第三方API调用)
  3. 当Celery任务的API调用完成时,将JSON帖子发送到应用程序中的另一个URL
  4. 获取该JSON数据并使用它更新数据库记录
  5. 以下是Celery任务的相关部分:

    if not response['errors']: # response comes from the Salesforce API call
        # do something to notify that the task was finished successfully
        message = {'flask_id' : flask_id, 'sf_id' : response['id']}
        message = json.dumps(message)
        print('call endpoint now and update it')
        res = requests.post('http://0.0.0.0:5000/transaction_result/', json=message)
    

    这是它所调用的端点:

    @app.route('/transaction_result/', methods=['POST'])
    def transaction_result():
        result = jsonify(request.get_json(force=True))
        print(result.flask_id)
        return result.flask_id
    

    到目前为止,我只是想获取数据并打印ID,之后我会担心数据库。

    我得到的错误是:requests.exceptions.ConnectionError: None: Max retries exceeded with url: /transaction_result/ (Caused by None)

    我的阅读表明我的数据可能不会以JSON的形式出现,因此结果上的Force = True,但即使这样也不行。我也尝试在CocoaRestClient中使用application-json的Content-Type标头执行相同的请求,并得到相同的结果。

    因为这两个尝试都破了,我无法判断我的问题是在请求中还是在尝试解析响应时。

1 个答案:

答案 0 :(得分:3)

首先request.get_json(force=True)返回一个对象(如果silent=True则返回None)。 jsonify将对象转换为JSON字符串。您正尝试访问 str_val .flask_id。这是不可能的。但是,即使在删除多余的jsonify电话后,您也必须将result.flask_id更改为result['flask_id']

所以,最终代码应如下所示:

@app.route('/transaction_result/', methods=['POST'])
def transaction_result():
    result = request.get_json()
    return result['flask_id']

当您使用REST客户端测试路由时,您绝对正确。它通过减少相关部件来简化测试过程。从烧瓶应用程序向同一个应用程序发送请求期间的一个众所周知的问题是在开发服务器下运行此应用程序只有一个线程。在这种情况下,请求将始终被内部请求阻止,因为当前线程正在为最外层请求提供服务而无法处理内部请求。但是,由于您要从Celery任务发送请求,因此不太可能是您的方案。

UPD:最后,最后一个原因是IP地址0.0.0.0。将其更改为真实解决了问题。