TypeError:无法解压缩不可编辑的对象

2024-03-28 17:00:28 发布

您现在位置:Python中文网/ 问答频道 /正文

当对我的flask应用程序执行post命令时,我得到“TypeError:cannot unpack non-iterable User object”。 我设法手动将用户添加到数据库中。当我试图使用post端点创建另一个用户时,我得到了正确的验证错误,即电子邮件存在。但是当我试图发布一个新的时,我得到了一个错误: TypeError:无法解压缩不可编辑的用户对象

我使用的是python3.7.4 烧瓶1.1.1 烧瓶棉花糖0.10.1

这是我的模型:

class User(db.Model, UserMixin):
__tablename__ = "user"
__table_args__ = {'extend_existing': True} 


id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), index=True, unique=True, nullable=False)
password = db.Column(db.String(128), nullable=False)
stride_account_id = db.Column(db.Integer, db.ForeignKey('stride_account.id'),
                           nullable=True)



def __repr__(self):
    return '<User {} with password {}>'.format(self.email, self.password)

def set_password(self, password):
    self.password = bcrypt.generate_password_hash(password)

def check_password(self, password):
    return bcrypt.check_password_hash(self.password, password)


def generate_auth_token(self):
    """ Create a jwt token for the user to access the api """
    session_exp = datetime.utcnow() + timedelta(minutes=15)
    if current_app.config['APP_CONFIG'] != 'config.Production':
        session_exp = datetime.utcnow() + timedelta(hours=12)
    payload = {
        'sub': self.id,
        'iat': datetime.utcnow(),
        'exp': session_exp
    }
    token = jwt.encode(payload, current_app.config['SECRET_KEY'])
    return token.decode('unicode_escape')

def save(self):
    db.session.add(self)
    db.session.commit()

以下是模式:

^{pr2}$

我的观点

lass UserView(Resource):

def get(self):
    user = User.query.filter(id='1')
    return 'Hello World'

@data_required
def post(self):
    data = request.get_json()#json.loads(request.data)
    print('data is: ', data)

    user, errors =  serializers.UserSchema().load(data)
    print('Hoooraaay')
    # user = User(email=data['email'], password=data['password'])
    user.set_password(user.password)
    user.save()  

    return serializers.UserSchema().jsonify(user)  

完整的错误消息是:

[2019-09-28 17:36:35,465] ERROR in app: Exception on /api/user [POST]
Traceback (most recent call last):
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask_restful/__init__.py", line 458, in wrapper
    resp = resource(*args, **kwargs)
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask/views.py", line 89, in view
    return self.dispatch_request(*args, **kwargs)
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask_restful/__init__.py", line 573, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/Users/ronshteinberg/development/stride-core/app/decorators.py", line 13, in wrapped_view
    return view(*args, **kwargs)
  File "/Users/ronshteinberg/development/stride-core/app/accounts/views.py", line 20, in post
    user, errors =  serializers.UserSchema().load(data)
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema.py", line 214, in load
    return super().load(data, **kwargs)
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/marshmallow/schema.py", line 720, in load
    data, many=many, partial=partial, unknown=unknown, postprocess=True
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/marshmallow/schema.py", line 898, in _do_load
    raise exc
marshmallow.exceptions.ValidationError: {'email': ['Email already exist']}
127.0.0.1 - - [28/Sep/2019 17:36:35] "POST /api/user HTTP/1.1" 500 -
data is:  {'email': 'sssss@aa.com', 'password': 'Qwert12345'}
[2019-09-28 17:36:40,644] ERROR in app: Exception on /api/user [POST]
Traceback (most recent call last):
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask_restful/__init__.py", line 458, in wrapper
    resp = resource(*args, **kwargs)
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask/views.py", line 89, in view
    return self.dispatch_request(*args, **kwargs)
  File "/Users/ronshteinberg/env/stride/lib/python3.7/site-packages/flask_restful/__init__.py", line 573, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/Users/ronshteinberg/development/stride-core/app/decorators.py", line 13, in wrapped_view
    return view(*args, **kwargs)
  File "/Users/ronshteinberg/development/stride-core/app/accounts/views.py", line 20, in post
    user, errors =  serializers.UserSchema().load(data)
TypeError: cannot unpack non-iterable User object

提前谢谢


Tags: inpyselfenvdatalibpackagesline
2条回答

与上述相同的问题:

在以前的版本中

flask-sqlachemy OR flask-marshmallow

加载函数返回2个

user, errors =  serializers.UserSchema().load(data)

在此源包中进行某些更新后,它开始返回一个值,因此要修复它,您需要为响应分配1个值:

^{pr2}$

处理验证错误的正确方法:

        try:
            obj = schema.load(data)
        except ValidationError as error:
            print(error.messages)

我发现了问题。 代码是从某个地方复制的看起来序列化程序.UserSchema().load(data)不返回元组,只返回对象 所以这条线应该是:

user =  serializers.UserSchema().load(data)

相关问题 更多 >