2016-12-26 7 views
2

私はFlaskを使用していますが、ユーザー認証のためにFlaskを使用しています。フラスコSQLAlchemyの店のsqliteデータベースでこれらのモデル:TypeError:0x7f86789f9bf8のsqlalchemy.orm.attributes.InstrumentedAttributeオブジェクトがJSONシリアライズ可能ではありません

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: <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f86789f9bf8> is not JSON serializable)で見ることができますエラーを発生させます。 AFAIK、InstumentedAttributeは関係に使用されていますが、それは私を助けませんでした。
また、login_user()が実行されてエラーが発生することもわかりました。ログインしていない登録は正常に動作します。
どうすれば修正できますか?今

+0

が、私はそれを言及したいと思います:

get_id()
This method must return a unicode that uniquely identifies this user, and can be used to load the user from the user_loader callback. Note that this must be a unicode - if the ID is natively an int or some other type, you will need to convert it to unicode.

私はこの問題を解決するために、これを書きました:すべてのフラスコビュー関数はデフォルトで 'get'メソッドをサポートしていますので、' if request.method == 'と書く必要はありません。 – metmirr

答えて

0

get_id()は、マニュアルでその間の整数を返している:それはあなたの問題に関するものではありません

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

元はインスタンスの代わりにクラス属性 'User.id'を返すしたがって、 'InstrumentedA ttribute';それは整数を返さなかった。 –

+0

私はそれについて忘れてしまった。ありがとう。 – NeoCortex

関連する問題