Flask 接收错误';预期字节数';尝试更新数据库条目时
My API允许用户通过向Flask 接收错误';预期字节数';尝试更新数据库条目时,flask,flask-sqlalchemy,flask-restplus,Flask,Flask Sqlalchemy,Flask Restplus,My API允许用户通过向/user端点发出PUT请求来更新其用户详细信息 但是,当我尝试发送更新时。尝试保存密码时失败,出现异常预期字节数 以下是我的路线: @UserNS.expect(UserModel) @token_required def put(self): """Updates the user details associated with the API token.""" token = request.headers['To
/user
端点发出PUT
请求来更新其用户详细信息
但是,当我尝试发送更新时。尝试保存密码时失败,出现异常预期字节数
以下是我的路线:
@UserNS.expect(UserModel)
@token_required
def put(self):
"""Updates the user details associated with the API token."""
token = request.headers['Token']
data = request.get_json()
if not data:
return jsonify({'message': 'Please enter some user data'})
else:
update_user = User.query.filter_by(api_token=token).first()
print("Updating user details")
print("Current: " + update_user.username + " " + update_user.email)
print("New: " + data["Username"] + " " + data["Email Address"])
try:
update_user.username = str(data["Username"])
update_user.email = str(data['Email Address'])
print("Trying to save password...")
update_user.set_password(data['Password'])
print("uh oh...")
db.session.commit()
return {'Message': 'Record updated!'}
except Exception as e:
print(e)
return {'Message': 'Username or email address is invalid!'}
以下是我的API模型:
UserModel = api.model('User', {'Username': fields.String(), 'Email Address': fields.String(), 'Password': fields.String()})
我的SQLAlchemy模型:
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True, unique=True)
api_token = db.Column(db.String(50), unique=True)
username = db.Column(db.String(128), index=True, unique=True)
email = db.Column(db.String(128), index=True, unique=True)
password_hash = db.Column(db.String(128))
todos = db.relationship('Todo', backref='owner', lazy='dynamic')
我使用非常相似的数据来注册帐户。所以不确定它没有保存新数据
编辑:我认为问题在于Python正在将update\u user
转换为非字节对象:
update\u user=user.query.filter\u by(api\u token=token.first()
因此,我需要一种读取方法来生成查询并存储它以供操作。无需将其转换为非字节对象
编辑2:
Flask login
用于使用以下定义存储密码:
def set_password(self, password):
self.password_hash = generate_password_hash(password)
底层的
werkzeug.security.generate\u password\u hash
方法需要一个str
作为输入。如果向其传递无效类型(如int),则会出现TypeError:Expected bytes
异常。方法文档
正如我在上面的评论中所指出的,有一些示例显示了确保表单上输入类型正确的工作示例。是在commit()调用时还是更早的时候出现了该异常?您使用的是什么框架?我认为您读取用户对象的方式不是问题所在。控制台的打印语句是:
更新用户详细信息
当前:Cindysylvialopez@yahoo.com
新增:伊桑derek07@gmail.com
试图保存密码…
预期字节数
127.0.0.1---[09/Feb/2020 14:51:42]“PUT/api/Users/HTTP/1.1”200-
我正在使用flask和flask rest plus作为api。是flask登录吗?设置密码是什么样子的?是的。更新了原始帖子。您是否尝试过将数据['Password']
转换为字节,然后再将其传入以设置\u密码,至少确认该密码可以解决问题(如果是str
请尝试将其编码为utf8)?这方面的教程通常显示直接从表单对象获取数据并调用生成密码散列的set_password方法。也许get_json()正在将密码转换为str
,然后需要将其转换回字节。请参见下面的示例,其中他们使用表单对象。