烧瓶代码没有意义(对我而言)

时间:2014-07-22 07:36:55

标签: python-2.7 flask flask-login

我正在阅读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.':

任何帮助都会非常感激。感谢。

2 个答案:

答案 0 :(得分:3)

request.endpoint包含auth.unconfirmedmain.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