Things You Should Know About Flask SERVER_NAME

January 16, 2018
url_for and routing

Setting SERVER_NAME has two major effects on url_for and routing.

url_for

Usually SERVER_NAME is set to enable url_for where request context is not available.

Setting a SERVER_NAME also by default enables URL generation without a request context but with an application context.

Without application context, you will bump into

RuntimeError: Attempted to generate a URL without the application context being pushed. This has to be executed when application context is available.

Without request context, you will bump into

RuntimeError: Application was not able to create a URL adapter for request independent URL generation. You might be able to fix this by setting the SERVER_NAME config variable.

You can utilize the following code to get the application context and fake/test request context to enable url_for.

app = Flask(__name__)

with app.app_context(), app.test_request_context():
    url = url_for('home')

NOTE: If you use _external=True parameter for the above code, localhost is always returned as SERVER/DOMAIN name.

routing

Once you set SERVER_NAME, Flask can only serve request from one single domain and return 404 for other domains.

If SERVER_NAME = 'mydomain.com', it won’t serve request from www.mydomain.com or mydomain.appspot.com.

References:

This work is licensed under a
Creative Commons Attribution-NonCommercial 4.0 International License.