2

首先,在我想回答这个问题之前,我想说如果有更合适的方法来完成这个,请告诉我,因为我可能会使用它。

好的,所以在我的应用程序中,我需要添加一个 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 对象。但是当我尝试从中检索任何值时,它返回空,甚至更改其中的基础键。对此的任何建议表示赞赏。

4

1 回答 1

3

看来 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']

所以让它做它的事情,不要忘记保存会话。

于 2012-12-06T23:23:04.850 回答