我正在阅读Miguel Grindberg的精彩新书" Flask Web Development",并且在第107页上并不理解此代码的一部分。
@auth.before_app_request
def before_request():
if current_user.is_authenticated() \
and not current_user.confirmed \
and request.endpoint[:5] != 'auth.':
return redirect(url_for('auth.unconfirmed'))
我不明白切片([:5])的目的是什么。 。
and request.endpoint[:5] != 'auth.':
这是他对代码的解释。 #3指的是相关的行。
" before_app_request处理程序将在三个条件时拦截请求 真正: 1.用户已登录(current_user.is_authenticated()必须返回True)。 2.未确认用户的帐户。 3.请求的端点(可以作为request.endpoint访问)在身份验证之外 蓝图。需要授予对身份验证路由的访问权限 这些是使用户能够确认帐户或执行的路线 其他帐户管理功能。"
我的问题是,为什么切片([:5])?对我来说,似乎代码将完美地匹配他的解释没有切片。他说,目的是捕获" auth"之外的任何端点,所以在我看来代码应该是。 。
and request.endpoint != 'auth.':
任何帮助都会非常感激。感谢。
答案 0 :(得分:3)
request.endpoint
包含auth.unconfirmed
或main.whatever
这里的代码是检查蓝图部分(在本例中为“auth。”)
后行
return redirect(url_for('auth.unconfirmed'))
执行后,再次调用整个代码块(request.endpoint的值为'auth.unconfirmed',没有切片,这将是一个无限循环)
长话短说:如果在auth blueprint
中不要重定向关于您的评论: 来自doc:
@before_app_request
这样的功能在每个请求之前执行, 即使在蓝图之外。
所以在return redirect(url_for('auth.unconfirmed'))
之后再次调用该块(新请求),但现在request.endpoint是字符串'auth.unconfirmed'。然后request.endpoint[:5] != 'auth.'
为假,然后没有进一步的重定向(否则会有无限循环)
答案 1 :(得分:0)
request.endpoint
是一个字符串。它不了解蓝图和观点。切片就在那里,因为request.endpoint
不仅包含'auth.'
,例如'auth.unconfirmed'
。这也可以写成request.endpoint.startswith('auth.')
。
request.endpoint != 'auth.'
将始终评估为true,因为永远不会有具有该名称的端点。如果您尝试评估url_for('auth.')
,则会获得BuildError
。