在同一蓝图中允许多个子域

anv*_*nvd 3 python subdomain blueprint flask

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

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

@mod.route('/', methods=['GET'])
def index():
    pass
Run Code Online (Sandbox Code Playgroud)

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

AAr*_*ias 6

不要定义当前正在执行它的蓝图的前缀和子域,定义如下:

mod = Blueprint('landing', __name__)
Run Code Online (Sandbox Code Playgroud)

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

app.register_blueprint(mod, subdomain='pt', url_prefix='/')
app.register_blueprint(mod, subdomain='br', url_prefix='/')
Run Code Online (Sandbox Code Playgroud)

编辑:

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

注册时,快速解决方法可能会执行以下操作:

app.register_blueprint(mod, subdomain='br')
mod.name = 'landing_pt'    
app.register_blueprint(mod, subdomain='pt')
Run Code Online (Sandbox Code Playgroud)

请注意,这样做的顺序很重要(首先注册一个,然后更改名称,然后注册另一个名称).

然后,url_for作为与两个子域的预期工作,它使用的是很重要的相对重定向url_for('.index')代替url_for('landing.index').

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

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