我使用Flask-HTTPAuth进行身份验证。我想根据请求是否经过身份验证来显示视图中的不同数据。使用auth.login_required
装饰视图仅向经过身份验证的用户显示。如何使用Flask-HTTPAuth测试请求是否已通过身份验证?
auth = HTTPBasicAuth()
@app.route("/clothesInfo")
@auth.login_required
def show_info():
return jsonify(blah blah blah)
答案 0 :(得分:4)
您想要的实际上非常容易实现。在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)
答案 1 :(得分:3)
您可以使用None
修饰返回login_required
的函数。在未经过身份验证的情况下调用它将返回错误响应,在经过身份验证时调用它将返回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
另见Default login_required rather than adding decorator everywhere。
答案 2 :(得分:0)
自 2020 年 4 月以来,事情变得更简单了。
Flask-HTTPAuth 4.0.0 向 optional
添加了 login required
参数来实现这一点。
来自the docs:
<块引用>一个可选的可选参数可以设置为 True 以允许路由在请求中不包含身份验证时也执行,在这种情况下 auth.current_user() 将设置为 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')