2011-11-03 35 views
16

Tôi đã triển khai hệ thống đăng ký/đăng nhập/xác thực bằng cách sử dụng this Django guide.Cách đăng nhập uid của người dùng từ phiên ở Django?

Nhưng, làm cách nào để truy cập thông tin của người dùng từ các chế độ xem của tôi để tôi có thể gửi thông tin của người dùng tới tệp mẫu?

Tôi muốn có thể truy cập ID của người dùng để tôi có thể gửi biểu mẫu có ID của người dùng được đính kèm vào biểu mẫu.

Trả lời

5

này:

def view(request): 
    if request.user.is_authenticated(): 
     user = request.user 
     # do something with user 
42

Trong trường hợp bất cứ ai muốn thực sự trích xuất một ID người dùng từ một đối tượng Session thực tế (vì lý do gì - tôi đã làm!), Dưới đây là cách:

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) 

tín dụng nên đến Scott Barnham

+0

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. –

+0

khi nào '_auth_user_id' được gắn vào đối tượng' Session' trong khi tạo một 'Session' mới? –

0

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

Các vấn đề liên quan