Flask shell - 如何为url_for _external = True设置服务器名称?

Zol*_*dor 2 jinja2 flask

我有一个在docker容器中运行的烧瓶应用程序.一切正常,除非我想在烧瓶外壳的同一个docker容器中做一些手工作业.问题是url_for(x, _external=True)始终返回https:// localhost,无论我如何尝试在shell中设置服务器名称.我显然已经尝试将SERVER_NAME设置为无变化.

$ python manage.py shell
>>> from flask import current_app
>>> current_app.config['SERVER_NAME'] = 'example.com'
>>> from app import models
>>> models.Registration.send_registration(id=123)
Run Code Online (Sandbox Code Playgroud)

jinja模板有: {{ url_for('main.index', _external=True, _scheme='https') }}

生成: https:// localhost

我想得到:https: //example.com

我使用的是Flask 0.11,Werkzeug 0.11.10和Jinja2 2.8

iur*_*vio 6

您的应用程序使用SERVER_NAME创建应用程序上下文时定义的应用程

如果要在shell中执行此操作,可以在设置后创建测试请求上下文SERVER_NAME.

>>> from flask import current_app, url_for
>>> current_app.config['SERVER_NAME'] = 'example.com'
>>> with current_app.test_request_context():
...     url = url_for('index', _external=True)
...
>>> print url
http://example.com/
Run Code Online (Sandbox Code Playgroud)

我们可以挖掘Flask代码来理解它.

Flask url_for使用它appctx.url_adapter来构建此URL.这url_adapter是在AppContext初始化时定义的,它在shell启动时发生.它调用它app.create_url_adapter并使用定义的SERVER_NAME.