0

次のようなルートが必要な Flask サイトを作成しています。

@app.route('/')
@app.route('/<page_id>')
@app.route('/<page_id>/<subpage_id>')
def page(page_id=None, subpage_id=None):
    ...

これは理論的には機能するように見えますが、実際にはルートの static/ ディレクトリにある静的リソースが壊れているようです。この理由は、動的ルートが実際に「static/style.css」と一致し、静的ファイルの通常のハンドラーをオーバーライドするためだと思います。

これを回避する方法はありますか?page_id=='static' を検出した場合にリクエストを転送できる 'static' ハンドラはありますか?

編集:これは実用的なサンプルです

@app.route('/<page_id>/<subpage_id>/<subsubpage_id>')
def xxx(page_id=None, subpage_id=None, subsubpage_id=None):
    return 'hello'

ここで開くhttp://127.0.0.1:5000/static/css/style.cssと、ファイルの代わりに「hello」が表示されるはずです。

4

2 に答える 2

5

あなたの問題の根本について:

はい。データベースに Page オブジェクトがあり、メソッドが呼び出されたときに page_id/subpage_id/subsubpage_id に基づいて読み込み、表示します。これを行うより良い方法はありますか?アプリの初期化時にページごとに個別のルートを追加することを考えていましたが、url_for と連携させる良い方法が見つかりませんでした。

を使用して、ルート ハンドラを直接登録できますapp.add_url_rule。デフォルトでは関数の名前が使用url_forされますが、endpoint引数を渡すことでオーバーライドできます。

だから多分あなたはこのようなものを持っているでしょう:

from functools import partial

def actual_handler(page):
    return u'hello'

for page in session.query(Page):
    route = u'/{0}/{1}/{2}'.format(page.id1, page.id2, page.id3)
    app.add_url_rule(
        route,
        page.name,  # this is the name used for url_for
        partial(actual_handler, page=page),
    )

セッションを取得するのはトリッキーかもしれませんし、そうでないかもしれませんsession.remove()。Flask ハンドラーの外で SQLAlchemy を使用したことはありません。そもそもSQLAを使用していると仮定します。

ルート処理に関するドキュメントも参照してください。

ルートが静的ファイルよりも優先されるという最初の質問については、私にはまったくわかりません。Flask と Werkzeug のドキュメントを読んだ限りでは、それは起こらないはずです。静的ファイルを手動で提供することでこれを解決したい場合は、おそらくsend_from_directory役立つでしょう。とにかく、おそらくあなたのウェブサーバーは本番環境で直接静的ファイルを提供するので、上記のメタプログラミングガンクに値するものではないかもしれません.

PS: 後付けです。サイト全体がデータベースにある場合は、 Pyramid のトラバーサルの方が適しているかもしれません。スタティック ルートの固定リストを使用するのではなく、一度に 1 つずつ動的にパス コンポーネントを調べます。

于 2013-01-16T01:06:23.297 に答える
1

これは恐ろしいハックですが、おそらく次のようなことを行うことができます。

@app.route('/<page_id>/<subpage_id>/<subsubpage_id>')
def xxx(page_id=None, subpage_id=None, subsubpage_id=None):
    if page_id == 'static':  # or whatever the path is to your assets
       # make a response where you've filled the request yourself
    return 'hello'
于 2013-01-15T23:58:04.107 に答える