我正在使用玻璃HTTPAUTH进行身份验证。我想根据请求是否经过身份验证,从视图显示不同的数据。用auth.login_required
装饰视图仅显示给经过身份验证的用户。如何测试是否用烧瓶-Httpauth对请求进行身份验证?
auth = HTTPBasicAuth()
@app.route("/clothesInfo")
@auth.login_required
def show_info():
return jsonify(blah blah blah)
您想要的实际上很容易实现。在您的verify_password
回调中,当用户不提供凭据时,您将获取用户名和密码设置为''
。您仍然可以从该功能返回True
,这将允许匿名用户访问端点。
以下示例演示了此技术:
auth = HTTPBasicAuth()
@auth.verify_password
def verify_password(username, password):
if username == '' or password == '':
# anonymous user, we still let them in
g.current_user = None
return True
g.current_user = my_verify_function(username, password)
return g.current_user is not None
@app.route("/clothesInfo")
@auth.login_required
def show_info():
if g.current_user:
# prepare data for authenticated users here
pass
else:
# prepare data for anonymous users here
pass
return jsonify(data)
您可以装饰使用login_required
返回None
的函数。在未身份验证的情况下调用它将返回错误响应,而在身份验证的同时将其返回None
。
# a dummy callable to execute the login_required logic
login_required_dummy_view = auth.login_required(lambda: None)
def is_authenticated():
try:
# default implementation returns a string error
return login_required_dummy_view() is None
except HTTPException:
# in case auth_error_callback raises a real error
return False
@app.route('/info')
def info():
if is_authenticated():
# logged in view
else:
# basic view
另请参见默认的login_required,而不是到处添加装饰器。
事情自2020年4月以来更简单。
Blask-Httpauth 4.0.0添加了optional
参数到login required
做到这一点。
来自文档:
可以将可选的可选参数设置为true,以允许在请求中不包含身份验证时,也可以执行执行路由,在这种情况下,将设置为none。示例:
@app.route('/private') @auth.login_required(optional=True) def private_page(): user = auth.current_user() return "Hello {}!".format(user.name if user is not None else 'anonymous')