Python 可选URL变量

Python 可选URL变量,python,url-routing,flask,Python,Url Routing,Flask,有没有办法在Flask中用可选的URL参数定义URL?本质上,我想做的是定义允许可选指定语言的规则: / /de -> matches / (but doesn't collide with /profile) /profile /de/profile 我想我已经找到了一种方法,但是它涉及到要么改变Werkzeug和Flask处理请求的方式(要么是猴子补丁,要么是分叉框架源代码)。不过,这似乎是一种处理此问题的过于复杂的方法。。有没有一种我忽略的更简单的方法 编辑: 根据Brian的回

有没有办法在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
类蓝图(蓝图):
定义初始化(自):
蓝图初始(自我,“定位”,“名称”)
def寄存器应用程序(自身,应用程序):
app.register_blueprint(self,url_defaults={'lang_code':'en'})
app.register_blueprint(self,url_前缀='/'))
self.app=app
(我还没有从变量列表中提取
lang\u code
,但很快就会这样做)


现在这只是一个热门话题。

蓝图可能适用于此,因为它们可以多次注册

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()
从烧瓶导入烧瓶,蓝图
app=烧瓶(名称)
bp=蓝图('main',\uuuuu名称\uuuuuu)
@bp.route(“/”)
你好(朗):
返回“你好”+lang+“!”
app.register_blueprint(bp,url_默认值={'lang':'en'})
app.register_blueprint(bp,url_前缀=“/”)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run()

如果可行,请参阅Flask文档中的方法,以避免在每个视图函数中指定
lang
参数。

如果您不知道,可以为一个视图注册多个路由。对每个视图都这样做可能会很痛苦,但这是可行的

DEFAULT_LANG = 'en'

@app.route('/profile')
@app.route('/<lang>/profile')
def profile(lang=DEFAULT_LANG):
   pass

我认为这是一个非常好且非常彻底的答案。这不是一个糟糕的解决方案,但我认为蓝图更正确,因为它们被设计成封装一组路由,并且让您可以轻松地同时操作所有这些路由。使用蓝图实现URL国际化:“你可以通过编写自己的装饰器,在URL前面加上语言代码来进一步改进这一点,但更漂亮的解决方案是使用蓝图。”@BrianMarshall,我+1你的答案。。。在你提供的链接上有很好的信息。+1我不知道你可以查看多条路线!非常有用。你好,你能举个完整的例子吗?使用html交换语言?这绝对是一个好方法,考虑到blueprintsCan的(相对)新热点,你能给我举个更好的例子吗?我想一直这样,mysite.com/en和mysite.com/ka也通过{{translations.any_record_from_database}}将数据库中的翻译消息通过方法传递给模板
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)