如何调试Flask BuildError

1 投票
2 回答
1971 浏览
提问于 2025-04-17 04:22

我正在调试一个在flask 0.8应用中出现的BuildError错误。这个错误发生在一个叫做 personal_open_account() 的函数里,当我试图渲染一个多步骤表单的第二部分时。第一步会渲染一个表单,如果表单通过验证,就会执行
return redirect(url_for('personal_open_account', step='2'))。也就是说,它会调用自己,但这次带上一个新的 step 参数。第一步成功完成,表单也通过了验证(我可以看到我放的打印语句),但接着我就立刻收到了一个BuildError错误:

Traceback (most recent call last):
  File "/Users/sth/.virtualenvs/sb/lib/python2.7/site-packages/flask/app.py", line 1518, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/sth/.virtualenvs/sb/lib/python2.7/site-packages/flask/app.py", line 1506, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Users/sth/.virtualenvs/sb/lib/python2.7/site-packages/flask/app.py", line 1504, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/sth/.virtualenvs/sb/lib/python2.7/site-packages/flask/app.py", line 1264, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/sth/.virtualenvs/sb/lib/python2.7/site-packages/flask/app.py", line 1262, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/sth/.virtualenvs/sb/lib/python2.7/site-packages/flask/app.py", line 1248, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/sth/dev/sb_flask/sb/views/personal.py", line 333, in personal_open_account
    return redirect(url_for('personal_open_account', step='2'))
  File "/Users/sth/.virtualenvs/sb/lib/python2.7/site-packages/flask/helpers.py", line 208, in url_for
    return ctx.url_adapter.build(endpoint, values, force_external=external)
  File "/Users/sth/.virtualenvs/sb/lib/python2.7/site-packages/werkzeug/routing.py", line 1605, in build
    raise BuildError(endpoint, values, method)
BuildError: ('personal_open_account', {'step': '2'}, None)  

这个函数本身看起来是这样的:

@app.route('/personal/save/<product_type>/<slug>/open-account', methods=['GET', 'POST'])
def personal_open_account(product_type, slug):
...

2 个回答

0

@app.route('/personal/save/<product_type>/<slug>/open-account' 这种写法是不对的。这里面有两个连续的标识符 /<product_type>/<slug>/,这样写会让路由器无法识别。你可以把路由改成这样 @app.route('/personal/save/<product_type>/slugs/<slug>/open-account'

0

从代码中很容易看出,后续的调用没有传递 product_id 和 slug 这两个参数。

撰写回答