2016-11-26 67 views
3

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

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

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

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

回答

5

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

mod = Blueprint('landing', __name__) 

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

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

编辑:

与给定的解决方案的问题,如通过OP所述,是第一注册b在模板中使用url_for时,lueprint将优先。

一个快速的解决方法可以在注册时可以做这样的事情:

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

注意,这是与完成的顺序是非常重要的(先注册一个,然后更改名称,然后注册另外一个)。

然后,对于url_for按预期使用这两个子域,重要的是使用relative redirectsurl_for('.index')而不是url_for('landing.index')

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

建议欢迎更好的这种肮脏的解决方法。

+0

这会造成一大堆问题。注册顺序将打破由于前缀而导致的所有链接。始终假定已注册第一个子域的前缀的链接。我将使用每个虚拟机的配置文件并解决此问题。 – anvd

+0

@andv我想我明白你的问题是什么。使用url_for时,第一个注册的子域优先。我只是编辑了解决此问题的解决方案。希望能帮助到你。 – AArias