为了账号安全,请及时绑定邮箱和手机立即绑定

为 Flask 创建认证装饰器的问题

为 Flask 创建认证装饰器的问题

MYYA 2021-11-02 15:32:31
我正在尝试为我的所有 Flask 设置一个身份验证装饰器app.routes。每次调用与路由关联的函数时,我都会检查请求是否传递了正确的密钥。我创建了一个装饰器(这可能是错误的)来做到这一点。首先它说它没有配置返回值,我后来修复了它。当我尝试再次运行它时,错误说:“类型错误:unregisterApi() 接受 0 个位置参数,但给出了 2 个。视图函数没有返回有效的响应。返回类型必须是字符串、元组、响应实例或可调用的 WSGI,但它是一个函数。”。我确定问题出在我的装饰器上,但我不知道如何解决它。这是装饰器和装饰函数的代码:装饰器:def requestAuth(func):   def funcWrapper():       data = request.get_json(force=True)       apiAddr = request.remote_addr       apiKey = data["API Register Key"]       conn = sqlite3.connect("database/controllerConfiguration.db")       cursor = conn.cursor()       cursor.execute('select apikey from SystemAPI where apihost  = \"{0}\";'.format(apiAddr))       result = cursor.fetchall()       if result[0][0] != apiKey:           return "ERROR - Authentication with the controller failed",400       elif result[0][0] == apiKey:           return func   return funcWrapper它修饰的路由关联函数:@app.route('/unregister',methods=['POST'])@requestAuthdef unregisterApi():   data = request.get_json(force=True)   apiKey = data["API Register Key"]   apiAddr = request.remote_addr   conn = sqlite3.connect('database/controllerConfiguration.db')   cursor = conn.cursor()   cursor.execute('delete from SystemAPI where apikey = \"{}\";'.format(apiKey))   conn.commit()   conn.close()   return jsonify({"Response":"Success"})我希望实现的是:每次(/unregister,/register,...)调用路由函数时,@requestAuth装饰器都会检查是否传递了正确的密钥,如果是,它将恢复到路由函数并执行它应该执行的操作,如果密钥不匹配,它将简单地返回并带有错误字符串相关状态码(string: "ERROR - Authentication with the controller failed", Status code: 400).
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

问题出在以下elif语句中funcWrapper

elif result[0][0] == apiKey:
   return func

func是一个可调用对象,即由 包裹的原始函数requestAuth,在这种情况下,是unregisterApi。相反,调用func返回有效类型而不是对象实例本身:

elif result[0][0] == apiKey:
   return func()

另外,请记住,如果ifelif语句都失败,None将返回funcWrapper,再次引发原始错误。因此,您可能需要重新考虑您希望如何处理该特定情况。


查看完整回答
反对 回复 2021-11-02
  • 1 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信