Trong trường hợp hwjp giải pháp không làm việc cho bạn ("Dữ liệu được hỏng"), đây là một giải pháp:
import base64
import hashlib
import hmac
import json
def session_utoken(msg, secret_key, class_name='SessionStore'):
key_salt = "django.contrib.sessions" + class_name
sha1 = hashlib.sha1((key_salt + secret_key).encode('utf-8')).digest()
utoken = hmac.new(sha1, msg=msg, digestmod=hashlib.sha1).hexdigest()
return utoken
def decode(session_data, secret_key, class_name='SessionStore'):
encoded_data = base64.b64decode(session_data)
utoken, pickled = encoded_data.split(b':', 1)
expected_utoken = session_utoken(pickled, secret_key, class_name)
if utoken.decode() != expected_utoken:
raise BaseException('Session data corrupted "%s" != "%s"',
utoken.decode(),
expected_utoken)
return json.loads(pickled.decode('utf-8'))
s = Session.objects.get(session_key=session_key)
decode(s.session_data, 'YOUR_SECRET_KEY'))
tín dụng cho: http://joelinoff.com/blog/?p=920
Thật tuyệt, điều này có thể tiết kiệm 1 truy vấn: 'request.session.get ('_ auth_user_id')', thay vì 'request.user.id', nhưng có vẻ như' Yêu cầu Middleware' hoặc 'RequestContext' thực sự thực hiện truy vấn để truy xuất người dùng auth, vì vậy đây không phải là sự tiết kiệm thực tế trong một số trường hợp. –
khi nào '_auth_user_id' được gắn vào đối tượng' Session' trong khi tạo một 'Session' mới? –