【问题标题】:Flask shell - how to set server name for url_for _external=True?Flask shell - 如何为 url_for _external=True 设置服务器名称?
【发布时间】:2016-10-04 13:17:06
【问题描述】:

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

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

这会产生: https://localhost

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

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

【问题讨论】:

    标签: flask jinja2


    【解决方案1】:

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

    【讨论】:

    • 谢谢,已经成功了。我没有意识到我需要在设置 SERVER_NAME 后创建一个新的请求上下文。再次感谢!
    • 使用test_request_context()有什么缺陷吗?我担心这不是生产服务器的适用解决方案。请帮忙!
    • @TheWhiteLlama 我知道这已经晚了,但是如果只需要一个新的上下文,那么您可以尝试使用with current_app.app_context(): ...
    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 2017-12-02
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2014-02-24
      • 2020-05-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多