Flask view return error “View function did not return a response”

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"

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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.

Method 2

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."

Method 3

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)


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x