2014-09-20 18 views
0

我嘗試編寫一個函數,該函數獲取登錄人的username,然後將session_key更改爲新的函數。續訂session_key django

我至今寫的是這樣的:

def get_username(request): 
    try: 
     for coisa in request: 
      session_key = coisa # This seems to be wrong, but it works 
     session = Session.objects.get(session_key=session_key) 
     user_id = session.get_decoded().get('_auth_user_id') 
     user = User.objects.get(id=user_id) # Works very well until here, trust me 
     session.cycle_key()  #this is where I'm getting the error 
     return HttpResponse(user.username) 
    except Exception, e: 
     print 'Erro: ' + str(e) 
     return HttpResponseServerError(str(e)) 

該請求可變我路過不是一般的Django的要求,這是由一個javascript腳本建立了一個請求,只有在其數據session_key可以。

我得到的錯誤是這樣的:'Session' object has no attribute 'cycle_key'

我使用這個函數的session_key可以從運行時,頁面會加載,讓request是一個「正常」的請求函數來了從django變量:

session_key = request.session.session_key 

回答

0

我不明白你爲什麼要做所有這一切。該用戶已在request.user中,因此不需要從會話中獲取該會話,並且類似地,會話本身在request.session中 - 因此您可以僅執行request.session.cycle_key()

+0

這get_username功能將被用於驗證和設置用戶的用戶名登錄聊天服務器上(使用節點和socket.io)。我的方法,這是獲得:它與會話密鑰初始化用戶名和來自django的session_key並進行比較。如果它們來自同一個用戶,那麼可以,我們可以繼續,否則全部取消,但是這個函數是從聊天服務器調用的,所以它發送的請求與django不一樣。由於這個原因,我不能簡單地做'request.session.cycle_key()'或'request.user' – user2449798 2014-09-20 22:33:38

0

cycle_key()屬於sessions.backends.db.SessionStore(從SessionBase繼承),你在這裏試圖使用的是 是models.Session,它是一個會話模型。通常request.session IIRC是SessionStore的一個實例。

所以你需要在這裏創建一個新的SessionStore。

session = SessionStore(session_key) 
+0

我試過了,但是這個錯誤:''SessionStore'對象沒有屬性'_session_cache'。我可以使用相同的session_key來獲取這兩個對象嗎? – user2449798 2014-09-20 22:43:21

+0

嘗試添加,創建後,session._session_cache = session.load()。但是,我不確定你是否獲得了正確的會話密鑰。你的代碼沒有多大意義 - 你正在遍歷請求,只使用其中的最後一個值來設置會話密鑰。 – Rainy 2014-09-21 02:05:48

+0

謝謝,我會試試看。這個循環確實很奇怪,但是當我打印出所有的結果時,我得到的結果就是關鍵,所以它很有用。 – user2449798 2014-09-21 14:51:12