烧瓶外壳 - 如何为 url_for _external=True 设置服务器名称



我有一个在 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)

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

这将产生:https://localhost

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

我正在使用烧瓶 0.11、Werkzeug 0.11.10 和 Jinja2 2.8

应用使用创建应用程序上下文时定义的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/

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

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

此解决方案与已经提出的解决方案非常相似,只是需要的步骤更少:

from flask import current_app, url_for
with current_app.test_request_context('localhost.com'):
    url = url_for('index')
    ...

这样就不需要设置配置SERVER_NAME因为我们在现场注入reqctx,以便url_for可以正确构建路径。就我而言,我想要一个相对路径,因此我不需要添加属性_external.

最新更新