6

FlaskでオプションのURLパラメータを使用してURLを定義する方法はありますか?基本的に、私がやりたいのは、オプションで指定された言語を許可するルールを定義することです。

/
/de -> matches / (but doesn't collide with /profile)
/profile 
/de/profile

私はそれを行う方法を考え出したと思いますが、それはWerkzeugとFlaskがリクエストを処理する方法を変更することを含みます(モンキーパッチまたはフレームワークソースのフォーク)。これは、この問題に対処するための非常に複雑な方法のようですが、私が見落としている、これを行うためのより簡単な方法はありますか?

編集:

ブライアンの答えに基づいて、これが私が思いついたものです:

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することになっていませんが、まもなくそれを行う予定です)

今、それはただのホットな私見です。

4

2 に答える 2

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)
于 2012-11-24T02:29:21.323 に答える
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ドキュメントの国際化されたブループリントURLを参照してください。lang

于 2012-11-24T02:20:05.927 に答える