【问题标题】:Multiple subdomains allowed in the same blueprint同一蓝图中允许多个子域
【发布时间】:2016-11-26 03:10:18
【问题描述】:

我需要在此蓝图中允许两个子域。在这种情况下,pt 和 br。我怎样才能做到这一点?据我所知,我只能有一个子域参数。我想为两种语言 [pt 和 br] 使用此功能。

mod = Blueprint('landing', __name__, url_prefix='/', subdomain='pt')

@mod.route('/', methods=['GET'])
def index():
    pass

我想避免使用dynamic 子域,因为我不想更改我所有的url_for()

【问题讨论】:

    标签: python flask subdomain blueprint


    【解决方案1】:

    不要定义你当前正在做的蓝图的前缀和子域,像这样定义它:

    mod = Blueprint('landing', __name__)
    

    然后,只需注册蓝图两次,每个子域一次:

    app.register_blueprint(mod, subdomain='pt', url_prefix='/')
    app.register_blueprint(mod, subdomain='br', url_prefix='/')
    

    编辑:

    如 OP 所述,给定解决方案的问题在于,在模板中使用 url_for 时,第一个注册的蓝图将优先。

    注册时可以做这样的快速解决方法:

    app.register_blueprint(mod, subdomain='br')
    mod.name = 'landing_pt'    
    app.register_blueprint(mod, subdomain='pt')
    

    请注意,执行此操作的顺序很重要(先注册一个,然后更改名称,然后再注册另一个)。

    然后,为了使url_for 能够在两个子域中正常工作,使用relative redirects 就像url_for('.index') 而不是url_for('landing.index') 非常重要。

    通过更改第二次注册的蓝图名称,我们诱使 Flask 认为这是一个不同的蓝图。

    欢迎提出建议以改进这种肮脏的解决方法。

    【讨论】:

    • 这会导致一大堆问题。由于前缀的原因,注册顺序将破坏所有链接。始终假定链接具有注册的第一个子域的前缀。我将为每个 VM 使用一个配置文件来解决这个问题。
    • @andv 我想我明白你的问题是什么。使用 url_for 时,第一个注册的子域优先。我刚刚用解决这个问题的方法编辑了答案。希望对您有所帮助。
    猜你喜欢
    • 2017-01-12
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多