3

フラスコの url_for ジェネレーターがビューの 1 つで機能しません (他のビューで機能します)。/user/?name=Joe私が期待している間、ジェネレーターは与えてい/u/Joeます。

テンプレートでは、次を使用してユーザー ページの URL を取得しようとしています。{{ url_for('user', name = g.user.name ) }}

これは対応するビュー関数です:

@app.route('/u/<name>')
@login_required
def user(name):

最初はこれでうまくいきましたが、何かが変わりました。ビュー名と URL を変更しようとしましたが、うまくいきませんでした。

何かご意見は?私はこれで途方に暮れています...

完全なアプリは GitHub で入手できます: https://github.com/joehand/weight-and-more-tracker

編集@login_required装飾されたものはFlask-loginによって提供されるものです。

さらに、<name>変数を削除しても問題は解決しません。その場合、URL は/user.

4

2 に答える 2

0

login_required関数をデコレータで「ラップ」しましたか?あなたの場合、フラスコのビュー関数の引数ではなく、クエリ文字列として url に提供されます。おそらく、フラスコは、装飾されたビュー関数nameの引数の仕様を把握していません。user

ドキュメントから:

それでは、そのようなデコレータを実装しましょう。デコレータは、関数を返す関数です。実際にはかなり単純です。このようなものを実装するときに心に留めておかなければならない唯一のことは、関数の namemodule、およびその他の属性を更新することです。これはよく忘れられますが、手動で行う必要はありません。デコレータ ( functools.wraps()) のように使用される関数があります。

from functools import wraps
from flask import g, request, redirect, url_for

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if g.user is None:
            return redirect(url_for('login', next=request.url))
        return f(*args, **kwargs)
    return decorated_function
于 2013-04-09T18:53:22.507 に答える