我正在努力修改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)
答案 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