Reputation:
I have a view that calls a function to get the response. However, it gives the error View function did not return a response
. How do I fix this?
from flask import Flask
app = Flask(__name__)
def hello_world():
return 'test'
@app.route('/hello', methods=['GET', 'POST'])
def hello():
hello_world()
if __name__ == '__main__':
app.run(debug=True)
When I try to test it by adding a static value rather than calling the function, it works.
@app.route('/hello', methods=['GET', 'POST'])
def hello():
return "test"
Upvotes: 45
Views: 51470
Reputation: 127400
No matter what code executes in a view function, the view must return a value that Flask recognizes as a response. If the function doesn't return anything, that's equivalent to returning None
, which is not a valid response.
In addition to omitting a return
statement completely, another common error is to only return a response in some cases. If your view has different behavior based on an if
or a try
/except
, you need to ensure that every branch returns a response.
This incorrect example doesn't return a response on GET requests, it needs a return statement after the if
:
@app.route("/hello", methods=["GET", "POST"])
def hello():
if request.method == "POST":
return hello_world()
# missing return statement here
This correct example returns a response on success and failure (and logs the failure for debugging):
@app.route("/hello")
def hello():
try:
return database_hello()
except DatabaseError as e:
app.logger.exception(e)
return "Can't say hello."
Upvotes: 15
Reputation: 2663
In this error message Flask complains that the function did not return a valid response
. The emphasis on response suggests that it is not just about the function returning a value, but a valid flask.Response
object which can print a message, return a status code etc. So that trivial example code could be written like this:
@app.route('/hello', methods=['GET', 'POST'])
def hello():
return Response(hello_world(), status=200)
Or even better if wrapped in the try-except clause:
@app.route('/hello', methods=['GET', 'POST'])
def hello():
try:
result = hello_world()
except Exception as e:
return Response('Error: {}'.format(str(e)), status=500)
return Response(result, status=200)
Upvotes: 0
Reputation: 43111
The following does not return a response:
@app.route('/hello', methods=['GET', 'POST'])
def hello():
hello_world()
You mean to say...
@app.route('/hello', methods=['GET', 'POST'])
def hello():
return hello_world()
Note the addition of return
in this fixed function.
Upvotes: 62