I'm working on my first Flask app (version 0.10.1), and also my first Python (version 3.5) app. One of its pieces needs to work like this:
Here's the relevant part of the Celery task:
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)
And here's the endpoint it calls:
@app.route('/transaction_result/', methods=['POST'])
def transaction_result():
result = jsonify(request.get_json(force=True))
print(result.flask_id)
return result.flask_id
So far I'm just trying to get the data and print the ID, and I'll worry about the database after that.
The error I get though is this: requests.exceptions.ConnectionError: None: Max retries exceeded with url: /transaction_result/ (Caused by None)
My reading indicates that my data might not be coming over as JSON, hence the Force=True on the result, but even this doesn't seem to work. I've also tried doing the same request in CocoaRestClient, with a Content-Type header of application/json, and I get the same result.
Because both of these attempts break, I can't tell if my issue is in the request or in the attempt to parse the response.
Flask has a utility called jsonify () that makes it more convenient to return JSON responses from flask import Flask, jsonify app = Flask (__name__) @app.route ('/api/get-json') def hello (): return jsonify (hello='world') # Returns HTTP Response with {"hello": "world"}
If the mimetype of the HTTP request is application/json, calling request.get_json () will return the parsed JSON data (otherwise it returns None) The parameter -H 'Content-Type: application/json' specifies that this is a JSON request:
First of all request.get_json (force=True) returns an object (or None if silent=True ). jsonify converts objects to JSON strings. You're trying to access str_val .flask_id. It's impossible. However, even after removing redundant jsonify call, you'll have to change result.flask_id to result ['flask_id'].
A working REST API can be served up in seconds through a few lines of code: from flask import Flask, request app = Flask (__name__) @app.route ('/') def hello(): return 'Hello!' if __name__ == "__main__" : app.run () The backbone of the modern web is the HTTP protocol - which sends requests and delivers responses back.
First of all request.get_json(force=True) returns an object (or None if silent=True). jsonify converts objects to JSON strings. You're trying to access str_val.flask_id. It's impossible. However, even after removing redundant jsonify call, you'll have to change result.flask_id to result['flask_id'].
So, eventually the code should look like this:
@app.route('/transaction_result/', methods=['POST'])
def transaction_result():
result = request.get_json()
return result['flask_id']
And you are absolutely right when you're using REST client to test the route. It crucially simplifies testing process by reducing involved parts. One well-known problem during sending requests from a flask app to the same app is running this app under development server with only one thread. In such case a request will always be blocked by an internal request because the current thread is serving the outermost request and cannot handle the internal one. However, since you are sending a request from the Celery task, it's not likely your scenario.
UPD: Finally, the last one reason was an IP address 0.0.0.0. Changing it to the real one solved the problem.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With