url_for and routing
Setting SERVER_NAME has two major effects on
url_for and routing.
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
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.
Once you set SERVER_NAME, Flask can only serve request from one single domain and return 404 for other domains.
SERVER_NAME = 'mydomain.com', it won’t serve request from