Flask-SQLAlchemy过滤字符串字段报TypeError: %d format: a number is required, not str
你代码里的错误是在获取请求参数时错误传递了类型参数导致的。
看你路由函数里的这行代码:
token = request.args.get('apitoken', '1', type=String)
这里request.args.get的type参数需要传入Python原生的类型,你此处用的String是SQLAlchemy的字段类型(大概率是你导入的sqlalchemy.types.String或者db.String),不是Python内置的字符串类型str。
这就导致你拿到的token变量不是实际的请求参数字符串,而是SQLAlchemy的String类型实例。后续你把这个实例和User.api_token字段做等值查询时,SQLAlchemy会尝试把这个String实例当成字段编译成SQL语句,取字段长度拼接VARCHAR定义时,就触发了%d需要数字但拿到了字符串的报错。
修复方法
把上面那行代码的type=String改成type=str即可:
token = request.args.get('apitoken', '1', type=str)
额外注意
你代码里还有一处逻辑错误:查询到user对象之后,你直接判断current_user.classe,但此时用户还未执行login_user操作,current_user是匿名用户实例,没有classe属性,会触发新的报错。你应该用你刚查询到的user对象做判断:
if user: # 替换成user.classe,不是current_user.classe if user.classe == -1 : return "-1" if user.classe == 0 : return "0" login_user(user) # 后续逻辑不变
内容的提问来源于stack exchange,提问作者Rodrigo P.
相关产品推荐
相关产品推荐

