我正在开发我的第一个Flask应用程序(版本0.10.1),以及我的第一个Python(版本3.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)
Run Code Online (Sandbox Code Playgroud)
这是它调用的端点:
@app.route('/transaction_result/', methods=['POST'])
def transaction_result():
result = jsonify(request.get_json(force=True))
print(result.flask_id)
return result.flask_id
Run Code Online (Sandbox Code Playgroud)
到目前为止,我只是想获取数据并打印ID,之后我会担心数据库.
我得到的错误是这样的: requests.exceptions.ConnectionError: None: Max retries exceeded with url: /transaction_result/ (Caused by None)
我的阅读表明我的数据可能不会以JSON的形式出现,因此结果上的Force = True,但即使这样也似乎不起作用.我也尝试在CocoaRestClient中使用application-json的Content-Type标头执行相同的请求,并得到相同的结果.
因为这两个尝试都破坏了,我无法判断我的问题是在请求中还是在尝试解析响应时.
首先request.get_json(force=True)返回一个对象(如果是则返回 None silent=True)。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']
Run Code Online (Sandbox Code Playgroud)
当您使用 REST 客户端来测试路由时,您是绝对正确的。它通过减少涉及的部件极大地简化了测试过程。从 Flask 应用程序向同一应用程序发送请求期间的一个众所周知的问题是在开发服务器上仅使用一个线程运行该应用程序。在这种情况下,请求将始终被内部请求阻塞,因为当前线程正在服务最外层的请求,无法处理内部请求。但是,由于您是从 Celery 任务发送请求,因此这不太可能是您的情况。
UPD:最后,最后一个原因是 IP 地址0.0.0.0。换成正品就解决了这个问题。
| 归档时间: |
|
| 查看次数: |
12237 次 |
| 最近记录: |