2012-12-06 87 views
2

首先,之前我想這個問題,我想說的是,如果沒有做到這一點更合適的方式,請讓我知道,因爲我可能可以使用那。Django的會話

好了,我在我的應用程序,我需要添加一個REST API,允許用戶登錄,改變了一些東西,並註銷無需使用瀏覽器。我想我會讓我寫的api_login視圖返回他們的session_key,然後讓每個請求傳回會話密鑰。例如然後

def login(request): 
    ... all the django auth code I have 
    # login adds the information to the request right? 
    login (request, user) 
    return simplejson.dumps({'key': request.session.session_key}) 

我所面臨的問題是,稍後再嘗試使用session_key如下,但是這個失敗奇怪

key = request.GET['key'] 
my_session = SessionStore(session_key=key) 
my_session.session_key == key 
>>> True 
my_session.values() 
>>> [] 
my_session.session_key == key 
>>> False 

因此,大家可以看到,我從數據庫中檢索與SessionStore對象正確的關鍵。但是,當我嘗試從中檢索任何值時,它將返回空,並且偶數會更改其中的基礎密鑰。任何意見,這是表示讚賞。

+0

這不是你的問題的答案,但你應該檢查出django-tastypie。它處理多種身份驗證方案,包括類似於您想要執行的任何操作。 http://django-tastypie.readthedocs.org/en/latest/authentication_authorization.html#authentication-options – Alex

回答

2

看來Django的或者需要知道的會話密鑰,或有可能產生它自己。我的猜測是要麼餵它一個隨機的鑰匙,要麼它一無所知(因爲它沒有保存)。您的示例在我的shell中以完全相同的方式工作。現在,這裏是我的例子:

>>> from django.contrib.sessions.backends.db import SessionStore 
>>> key = 'asdf1234' 
>>> my_session = SessionStore(session_key=key) 
>>> my_session.session_key == key 
True 
>>> my_session['foo'] = 'bar' 
>>> my_session.values() 
['bar'] 
>>> my_session.session_key == key 
False 
>>> my_session.session_key 
'358d6515b129631d89249687790adc49' 
>>> my_session.save() 

然後回來:

>>> from django.contrib.sessions.backends.db import SessionStore 
>>> my_session = SessionStore(session_key='358d6515b129631d89249687790adc49') 
>>> my_session.values() 
['bar'] 

所以就讓它做它的事,不要忘記保存會話。