0

Flask-Classy ビュー メソッドにアクセスするときに、テンプレートに url_for を埋め込む (またはビューで定義する) ときに問題が発生しています。

/app/routes.py

class BaseView(FlaskView):
    route_base '/'

    @route('index', endpoint('index')
    def index():
        return render_template('index.html')

    def resetapp():
        db.drop_all()
        return redirect(url_for('BaseView:index'))

/app/crm/accounts/routes.py

class AccountView(FlaskView):
    route_base '/crm/account/'

    @route('create', endpoint='create')
    def create():
        return render_template('path/to/create.html')

今「index.html」の中に、私は次のものを持っています

しかし、次のエラーが表示されます: werkzeug.routing.BuildError

BuildError: ('AccountView.create', {}, None)

最初のルートを見ると、resetapp自分自身を BaseView:index として参照する url_for を使用するルートがあります - これは機能します!

index.html {{ url_for('AccountView:create') }} でも同じ形式を試しましたが、同じエラーが発生しました。

何か案は?

4

3 に答える 3

1

ビューの登録を忘れているようですBaseView.register(app)。以下は実行可能なコードです。

from flask import Flask,url_for,redirect,render_template
from flask.ext.classy import FlaskView,route

app = Flask(__name__)

class BaseView(FlaskView):
    route_base= '/'

    @route('index')
    def index(self):
        print url_for('BaseView:index')
        return render_template("index.html")
    @route('reset')
    def reset(self):
        print url_for('BaseView:reset')
        return redirect(url_for('BaseView:index'))
BaseView.register(app)
if __name__ == '__main__':
    app.run(debug=True)
于 2013-02-15T13:00:09.973 に答える
1

OK、少し時間がかかりましたが、私はあなたを野生のガチョウの追跡に導きます. 問題はある人が示唆したようなものでしたが、主な問題は引数を持つルートに関係していました...

やり方を知りたい人向け。これが Flask-Classy url_for() の答えです

@route('update/<client_id>', methods=['POST','GET'])
def update(self, client_id=None):

    if client_id is None:
        return redirect(url_for('ClientView:index'))

あなたのテンプレートで:

{{ url_for('YourView:update', client_id=some_var_value, _method='GET') }}

Flask-Classy を適切に使用するために、できないことがあります。

  1. エンドポイントを設定します - これはノーノーです。エンドポイントを設定すると、Class:Method ルーティングがオーバーライドされます。
  2. 正しい数のクエリ引数を指定してください。
  3. url_for を使用する場合、複数のルートを定義することはできません

メソッドも具体的に提供しますが、これは不要です。

ポイント3について-これは、複数のルートがある場合に、どのルートを使用するかをどのように判断するかです。シンプルですが、これが私がぐるぐる回っていたものです。追加のルートを削除する以外はすべて実行します。

于 2013-03-02T20:32:22.323 に答える
1

問題は、ルート デコレーターでエンドポイントをオーバーリングしているにもかかわらず、デフォルトのエンドポイントからそれらにアクセスしようとしていることです。またindex特別なメソッドであり、ルートFlaskView. (パラメーターも忘れてしまいましたself!) コードを次のように変更してみてください。

class BaseView(FlaskView):
    route_base '/'

    def index(self):
        return render_template('index.html')

    def resetapp(self):
        db.drop_all()
        return redirect(url_for('BaseView:index'))

url_for('BaseView:index')戻ります"/"

于 2013-02-18T05:11:09.300 に答える