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',{},无)

如果您查看第一条路线,则resetapp其中使用 url_for 将自身引用为 BaseView:index - 这有效!

我也在 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

问题是您覆盖了路由装饰器中的端点,但仍在尝试从默认端点访问它们。也是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 回答
1

好的,这需要一段时间 - 但事实证明我带你去追逐野鹅。问题有点像一个人的建议,但主要问题是与有争论的路线有关......

对于那些想知道如何做到这一点的人。这是 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 点 - 这是因为当有超过 1 条路线时 - 它如何知道使用哪条路线?很简单,但这就是我一直在追逐自己的目的。做所有事情,除了删除额外的路线。

于 2013-03-02T20:32:22.323 回答