2012-09-26 1 views
0

newb pour python et pyramide/pylônes. Après la connexion d'un utilisateur, je souhaite récupérer des données dans ma base de données et les stocker dans une variable de session. J'ai pu stocker l'identifiant de connexion de l'utilisateur avec remember(). En utilisant request.session, je peux définir une variable de session tant que c'est une chaîne mais si j'essaie de récupérer quelque chose de ma base de données, j'obtiens une erreur: "BadPickleGet: ". Voici la partie pertinente de mon avis:Comment définir une variable de session sur une valeur dans ma base de données?

if 'form.submitted' in request.params: 
     login = request.params['login'] 
     password = request.params['password'] 
     if User.check_password(login, password): 
      headers = remember(request, login) # ie dave 
      session = request.session 
      #session['myvar'] = 'somethinghardcoded' # this works! 
      session['myvar'] = User.myfield # this doesn't work! 
      session.save() 
      return HTTPFound(location=came_from, headers=headers) 

Répondre

5

Dans votre exemple, vous n'avez pas affaire à une instance de User que vous chargez à partir de la base de données. Ce serait quelque chose comme user = DBSession.query(User).filter_by(login).first(). Il y a une grande différence entre User.myfield et user.myfield, où le premier est juste l'objet Column ou la propriété et la seconde est les données réelles pour une ligne spécifique dans la base de données. Votre erreur est probablement juste dans l'incapacité de décaper un objet Column. La session peut décaper les types primitifs (ints, chaînes, etc.) très bien.

0

Pyramid Sessions:

Keys and values of session data must be pickleable. This means, typically, that they are instances of basic types of objects, such as strings, lists, dictionaries, tuples, integers, etc. If you place an object in a session data key or value that is not pickleable, an error will be raised when the session is serialized.

Cela signifie: Vos données ne peuvent pas être décapés et vous devez fournir une méthode pour le retourner dans un format qui peut être décapée (J'aime faire une méthode appelée todict()).

Mais il semble y avoir un deuxième problème:

[...]in my database?

L'usine de session par défaut (que je suppose que vous utilisez), ne stocke pas vos données dans une base de données, mais dans un cookie (où il est non crypté). Vous pouvez jeter un oeil à pyramid_beaker, c'est peut-être la bonne chose pour vous ici. Dans ce cas, vous avez toujours besoin de données qui peuvent être décapées (une dict, liste, chaîne, ...) Je suppose, mais alors dans la base de données et pas dans un cookie afin que vous puissiez y stocker des informations confidentielles (ne faites pas que dans la valeur par défaut!) et supprimer la limitation de longueur (4 Ko pour les cookies).

Questions connexes