有没有办法在Flask中使用可选的URL参数定义URL?基本上,我想要做的是定义允许选择指定语言的规则:
/
/de -> matches / (but doesn't collide with /profile)
/profile
/de/profile
我想我已经找到了一种方法,但它涉及改变Werkzeug和Flask如何处理请求(猴子修补或分支框架源)。这似乎是一种处理这个问题的过于复杂的方法。有一种更简单的方法可以做到这一点,我忽略了吗?
修改
根据Brian的回答,这是我想出的:
app.py :
from loc import l10n
def create_app(config):
app = Flask(__name__)
app.config.from_pyfile(config)
bp = l10n.Blueprint()
bp.add_url_rule('/', 'home', lambda lang_code: lang_code)
bp.add_url_rule('/profile', 'profile', lambda lang_code: 'profile: %s' %
lang_code)
bp.register_app(app)
return app
if __name__ == '__main__':
create_app('dev.cfg').run()
LOC / l10ln.py
class Blueprint(Blueprint_):
def __init__(self):
Blueprint_.__init__(self, 'loc', __name__)
def register_app(self, app):
app.register_blueprint(self, url_defaults={'lang_code': 'en'})
app.register_blueprint(self, url_prefix='/<lang_code>')
self.app = app
(我还没有从变量列表中提取lang_code
,但很快就会这样做了)
现在,这只是热点。
答案 0 :(得分:10)
如果您不知道,可以为视图注册多条路线。为每个观点做这件事可能会很痛苦,但这是可行的......
DEFAULT_LANG = 'en'
@app.route('/profile')
@app.route('/<lang>/profile')
def profile(lang=DEFAULT_LANG):
pass
或者,也许您可以实现自己的route
装饰器,它会自动调用app.route
两种情况......
from flask import Flask
app = Flask(__name__)
DEFAULT_LANG = 'en'
def lang_route(rule, **options):
def decorator(f):
endpoint = options.pop('endpoint', None)
app.add_url_rule(rule, endpoint, f, **options)
app.add_url_rule('/<lang>%s' % rule, endpoint, f, **options)
return f
return decorator
@lang_route('/profile') # also accepts '/<lang>/profile' automatically
def profile(lang=DEFAULT_LANG):
return lang
if __name__ == '__main__':
app.run(debug=True)
答案 1 :(得分:9)
蓝图可能适用于此,因为它们可以多次注册。
from flask import Flask, Blueprint
app = Flask(__name__)
bp = Blueprint('main', __name__)
@bp.route('/')
def hello(lang):
return 'Hello ' + lang + '!'
app.register_blueprint(bp, url_defaults={'lang': 'en'})
app.register_blueprint(bp, url_prefix='/<lang>')
if __name__ == '__main__':
app.run()
如果可行,请参阅Flask文档中的Internationalized Blueprint URLs,以避免在每个视图函数中指定lang
参数。