我已經使用this Django guide實施了註冊/登錄/認證系統。如何在Django中從會話登錄用戶的uid?
但是,如何從我的視圖訪問用戶的信息,以便我可以將用戶的信息發送到模板文件?
我希望能夠訪問用戶的ID,這樣我就可以提交帶有用戶ID的表單。
我已經使用this Django guide實施了註冊/登錄/認證系統。如何在Django中從會話登錄用戶的uid?
但是,如何從我的視圖訪問用戶的信息,以便我可以將用戶的信息發送到模板文件?
我希望能夠訪問用戶的ID,這樣我就可以提交帶有用戶ID的表單。
有附着到該請求的django.contrib.auth.models.User
對象;您可以通過request.user
在視圖中訪問它。不過,您必須安裝auth middleware。
此:
def view(request):
if request.user.is_authenticated():
user = request.user
# do something with user
如果有人想以實際提取的實際會話對象的用戶ID(不管是什麼原因 - 我做到了!),這裏是如何:
from django.contrib.sessions.models import Session
from django.contrib.auth.models import User
session_key = '8cae76c505f15432b48c8292a7dd0e54'
session = Session.objects.get(session_key=session_key)
session_data = session.get_decoded()
print session_data
uid = session_data.get('_auth_user_id')
user = User.objects.get(id=uid)
信貸應該去Scott Barnham
一個更更簡單的方法是安裝django-extensions並運行管理命令print_user_for_session。
這是他們如何做到這一點:
如果hwjp爲您解決( 「數據損壞」)不工作,這裏是另一種解決方案:
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'))
很酷,這可以節省1查詢:'request.session.get('_ auth_user_id')',而不是'request.user.id',但似乎'請求中間件「或」RequestContext「實際上做了一個查詢來檢索auth用戶,所以這在某些情況下並不實際存儲。 –
什麼時候'_auth_user_id'在創建一個新的'Session'時被附加到'Session'對象? –