【问题标题】:TypeError: sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f86789f9bf8 is not JSON serializableTypeError:0x7f86789f9bf8 处的 sqlalchemy.orm.attributes.InstrumentedAttribute 对象不是 JSON 可序列化的
【发布时间】:2016-12-26 09:25:47
【问题描述】:

我正在使用 Flask 和 Flask-Login 进行用户身份验证。 Flask-Sqlalchemy 将这些模型存储在 sqlite 数据库中:

ROLE_USER = 0
ROLE_ADMIN = 1

class Anonymous(AnonymousUserMixin):
  def __init__(self):
    self.username = 'Guest'

lm.anonymous_user = Anonymous

class User(UserMixin, db.Model):
 __tablename__ = "users"
 id = db.Column(db.Integer, primary_key = True)
 username = db.Column(db.String(64), index = True, unique = True)
 password = db.Column(db.String(20), index = False, unique = True)
 email = db.Column(db.String(120), index = True, unique = True)
 registered_on = db.Column('registered_on' , db.DateTime)
 role = db.Column(db.SmallInteger, default = ROLE_USER)

 def __repr__(self):
  return '<User %r>' % (self.username)

 def get_id(self):
  return User.id


class PostVote(db.Model):
 __tablename__ = "postvotes"
 post_id = db.Column(db.Integer, db.ForeignKey('posts.id'), primary_key = True)
 user_id = db.Column(db.Integer, default = 0)
 type = db.Column(db.Boolean, default = True)

class Post(db.Model):
 __tablename__ = "posts"
 id = db.Column(db.Integer, primary_key = True)
 body = db.Column(db.String(320))
 points = db.Column(db.Integer, default = 0)
 votes = db.relationship(PostVote)
 timestamp = db.Column(db.DateTime)
 user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

 def __repr__(self):
  return '<Post %r>' % self.body

还有我的登录代码:

@app.route('/login', methods = ['GET', 'POST'])
def init_login():
 form = LoginForm()
 if request.method == 'GET':
     return render_template('login/index.html', form = form, active = 'login')
 if form.validate():
     uname = form.username.data
     passw = form.password.data
     print('DBG: Loginning ' + uname) #for debug purposes
     registered_user = User.query.filter_by(username = uname).first()
     if registered_user is None:
         flash('User not found')
         return render_template('/login/index.html', form=form, 
         msgtype = 'alert-warning', active = 'login')
     if check_passw(passw, registered_user.password):
         login_user(registered_user)
         session['username'] = uname
         return redirect(url_for('init_login_success'))
     else:
         flash('Incorrect password')
         return render_template('/login/index.html', form=form, 
         msgtype = 'alert-danger', active = 'login')
 return render_template('login/index.html', form = form, active = 'login')

当我尝试登录时,SQLAlchemy 会触发错误,您可以在帖子标题 (TypeError: &lt;sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f86789f9bf8&gt; is not JSON serializable) 中看到该错误。 AFAIK,InstumentedAttribute 用于关系,但对我没有帮助。
我还发现发生错误,然后执行 login_user()。无需登录即可正常注册。
我该如何解决?

【问题讨论】:

  • 这不是你的问题,但我想提一下:每个烧瓶视图功能默认支持get方法,所以你不必写if request.method == 'GET'

标签: python json flask flask-sqlalchemy flask-login


【解决方案1】:

现在get_id() 在文档中同时返回一个整数:

get_id()
此方法必须返回唯一标识的 unicode 此用户,可用于从 user_loader 加载用户 打回来。请注意,这必须是 unicode - 如果 ID 本身是 int 或其他类型,您需要将其转换为 unicode.

我写这个是为了解决这个问题:

def get_id(self):
        return str(self.id)

【讨论】:

  • 请提一下原来是返回类属性User.id而不是实例属性,因此InstrumentedAttribute的整个麻烦;它没有返回一个整数。
  • 我忘了说。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-09-23
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2021-11-13
  • 2018-09-22
  • 2019-01-17
相关资源
最近更新 更多