2012-09-26 5 views
0

newb와 pyramid/python. 사용자가 로그인 한 후 데이터베이스의 일부 데이터를 가져 와서 세션 변수에 저장하려고합니다. remember()에 사용자의 로그인 ID를 저장할 수있었습니다. request.session을 사용하면 세션 변수를 문자열로 설정할 수 있지만 데이터베이스에서 무언가를 가져 오려고하면 "BadPickleGet : "오류가 발생합니다.데이터베이스의 세션 변수를 세션 변수로 설정하는 방법은 무엇입니까?

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) 

답변

5

예제에서는 데이터베이스에서로드하는 User의 인스턴스를 다루지 않습니다. 이것은 user = DBSession.query(User).filter_by(login).first()과 같을 것입니다. User.myfielduser.myfield 사이에는 큰 차이가 있습니다. 첫 번째는 Column 개체 또는 속성이고 두 번째는 데이터베이스의 특정 행에 대한 실제 데이터입니다. 당신의 실수는 아마도 Column 개체를 피클 할 수 없다는 것일뿐입니다. 세션은 기본 유형 (int, 문자열 등)을 잘게 피클 할 수 있습니다.

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.

이 의미 : 여기 내보기의 관련 부분 귀하의 데이터 절인 할 수 없다는 당신은 절인 할 수있는 형식으로 반환하는 방법을 제공해야 (저는 todict()이라는 메서드를 만드는 것을 좋아합니다). 이 암호화되지 않은 경우 (데이터베이스에 있지만 쿠키에 데이터를 저장하지 않습니다 (난 당신이 사용하는 가정)

[...]in my database?

기본 세션 팩토리 :

는하지만 두 번째 문제가있는 것 같습니다). pyramid_beaker을 살펴볼 수 있습니다. 여기에 맞는 것이 있습니다. 이 경우 당신은 여전히 ​​pickled (dict, list, string, ...) 데이터를 필요로한다. 그러나 데이터베이스에있는 것이지 쿠키에있는 것이 아니기 때문에 기밀 정보를 저장할 수있다. 기본적으로 길이 제한을 제거합니다 (쿠키의 경우 4KB).