如何使用或不使用令牌作为路径元素使用Flask方法

时间:2016-02-20 01:45:06

标签: python flask

我正在努力修改cookiecutter Flask应用。我正在尝试按https://realpython.com/blog/python/handling-email-confirmation-in-flask/添加电子邮件授权。

该应用会发送一封确认电子邮件。在这种情况下,电子邮件包含一个如下所示的确认链接:

http://127.0.0.1:5000/register/ImNsdWVtYXJpbmUxQG1haWxpbmF0b3IuY29tIg.CajQIA.Pn20l8bkpo3muh1Nk6TSguSoF0I

(其中包含令牌中嵌入的电子邮件'cluemarine1@mailinator.com'。)

这适用于注册功能(在公共蓝图中):

@blueprint.route("/register/<token>", methods=['GET', 'POST'])
def register(token):
    form = RegisterForm(request.form, csrf_enabled=False)
    email = confirm_token(token)
    ....

在我的代码的另一部分中,我想将用户重定向到寄存器功能,我使用了该行:

return redirect(url_for('public.register'))

在这种情况下,我没有使用令牌!这导致:

Werkzeug.routing.BuildError BuildError: ('public.register', {}, None)

我认为这是因为第二种方法没有令牌。什么是处理寄存器功能中是否有令牌的可能性的最佳方法?

完整追溯:

File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 1477, in full_dispatch_reques
rv = self.handle_user_exception(e)
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask_debugtoolbar\__init__.py", line 124, in dispatch_request
return view_func(**req.view_args)
File "C:\envs\r2\mini\myflaskapp\views\user.py", line 144, in confirm_email
return redirect(url_for('public.register'))
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\helpers.py", line 312, in url_for
return appctx.app.handle_url_build_error(error, endpoint, values)
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\app.py", line 1641, in handle_url_build_error
reraise(exc_type, exc_value, tb)
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\flask\helpers.py", line 305, in url_for
force_external=external)
File "C:\envs\virtalenvs\flask_mini\lib\site-packages\werkzeug\routing.py", line 1678, in build
raise BuildError(endpoint, values, method)

2 个答案:

答案 0 :(得分:1)

这样做的一种方法是两条不同的路线。

@blueprint.route("/register/", methods=['GET', 'POST'])
@blueprint.route("/register/<token>", methods=['GET', 'POST'])
def register(token=None):
    form = RegisterForm(request.form, csrf_enabled=False)
    email = confirm_token(token)
    ....

现在url_for('public.register')应该按预期工作。

答案 1 :(得分:1)

是的,可以指定默认值,您可以:

@blueprint.route("/register", defaults={'token': ''}, methods=['GET', 'POST'])
@blueprint.route("/register/<token>", methods=['GET', 'POST'])
def register(token):
    # do somethind here
    ....

以下是文档:URL Route Registrations