2013-03-23 52 views
4

我是很新的python web-dev,我有flask + wtforms应用程序。我可以在登录看到()存储 用户对象瓶颈:如何检索会话数据?

if user: 
    if user.verify_password(form.password.data): 
    flash('You have been logged in') 
    user.logins += 1 

    db.session.add(History(user.uid)) 
    db.session.commit() 

    session['user'] = user 

现在我想检索用户

if 'user' in session: 
     User=session.get('user') 
     print User.nickname ###<< how to retrieve specific object member? 

它失败,就像消息:

 Instance <User at 0x8e5a64c> is not bound to a Session; attribute refresh operation cannot proceed 

回答

7

很简单。如果您想要检索特定的对象,只需在会话中添加变量的名称,例如session['nickname']

您可以通过执行session['nickname'] = nickname以相同的方式设置变量。

在你的情况,你将它更改为以下

if 'user' in session: 
    user = session['user'] 
    print user 

if 'nickname' in session: 
    nickname = session['nickname'] 
    print nickname 

这是我使用的登录功能的简化版本。

@app.route('/login', methods=['POST']) 
def login(): 
    """Authenticate User""" 
    username = request.form['username'].strip() 
    nickname = request.form['nickname'].strip() 
    password = request.form['password'] 
    try: 
     if Auth().VerifyLogin(username, password): 
      session['username'] = username 
      session['nickname'] = nickname 
     else: 
      # failed to login, do something. 
    except Exception as why: 
     app.logger.critical('.....') 
+0

如何检索,如果它的对象?请检查上面的编辑代码部分。 'user'是一个有user.uid,user.logins和user.nickname成员的对象 – 2013-03-23 20:31:42

+0

非常感谢,明白了。使用你的第一种方法。不用担心物体和类似的东西。将昵称存储为会话变量而不是对象。谢谢您的帮助。 – 2013-03-23 20:41:02

+1

不用担心。顺便说一句,出于安全原因,最好将最少量的信息存储在会话中。我将所有权限等存储在数据库中。 – eandersson 2013-03-23 20:41:43