如何在Django中找到request.session的sessionid并将其作为变量使用?

108
我知道你可以使用request.session['variable_name']来获取会话变量,但似乎没有办法以类似的方式将会话ID(键)作为变量获取。这个在哪里有记录吗?我找不到相关信息。
9个回答

176
request.session.session_key

请注意,只有存在会话时才会存在键值,没有键值就代表没有会话。您可以使用这个来测试是否存在会话。如果您想要创建一个会话,请调用create函数。


3
根据@Vinicius的回答,request.session._session_key的含义是请求会话的会话密钥。请注意,我已尽力让翻译通俗易懂,但未改变原意。 - hughes
3
request.session.session_key 在 Django 1.6 中可以正常使用。 - ecstaticpeon
9
在 Django 1.7 中,“request.session.session_key”同样可正常工作。 - Andrew E
6
我更喜欢使用request.session._get_or_create_session_key(),因为有可能还没有ID。 - patroqueeet
2
这是否有效完全取决于会话是否已创建。请参阅我的答案。 - Greg
显示剩余6条评论

25

Django的会话将它们的密钥保存在cookie中。至少它的中间件是这样提取它的:

from django.conf import settings
session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]

1
如果会话密钥不存在,这并没有帮助。 - Greg

19

在 Django 版本 >= 1.4 中使用:

request.session._session_key

12
私有变量(以下划线开头的变量)的主要目的是让你不要使用它们。 - Michał Górny
1
@MichałGórny,那有什么替代方法吗?如果没有,我不明白我们有什么选择... - Mark
1
另一种选择是编写适当的代码。如果Django没有提供公共 API 来获取会话密钥,那么这意味着您不应该使用该密钥。我无法告诉您更多信息,除非知道您具体要做什么,但这可能需要单独提出问题。 - Michał Górny

13
为了可靠地获取会话密钥,您需要确保会话已被创建。文档提到一个 `.create()` 会话方法,可以用来确保有会话密钥:文档
def my_view(request):
    if not request.session.session_key:
        request.session.create()

    print(request.session.session_key)

13

此操作将为您获取一个会话ID或为您创建一个会话ID。如果您执行 dir(request.session), 您将获得许多有用的方法。

['TEST_COOKIE_NAME', 'TEST_COOKIE_VALUE', '__class__', '__contains__',
'__delattr__', '__delitem__', '__dict__', '__doc__', '__format__',
'__getattribute__', '__getitem__', '__hash__', '__init__', '__module__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'_get_new_session_key', '_get_or_create_session_key', '_get_session',
'_get_session_key', '_hash', '_session', '_session_key', 'accessed',
'clear', 'create', 'cycle_key', 'decode', 'delete', 'delete_test_cookie',
'encode', 'exists', 'flush', 'get', 'get_expire_at_browser_close',
'get_expiry_age', 'get_expiry_date', 'has_key', 'items', 'iteritems',
'iterkeys', 'itervalues', 'keys', 'load', 'modified', 'pop', 'save',
'session_key', 'set_expiry', 'set_test_cookie', 'setdefault',
'test_cookie_worked', 'update', 'values']


session_id = request.session._get_or_create_session_key()

9

使用:

request.COOKIES['sessionid']

3
在Django 1.8中:

request.session.session_key

request.session._session_key

两者都可以正确使用。

0
你可以通过以下方式在Django视图中使用session_key_session_key_get_session_key()来获取会话密钥。*我使用的是Django 4.2.1版本。
# "views.py"

from django.http import HttpResponse

def my_view(request):
    print(request.session.session_key) # w85oia6b5yqj5n2t6n7lpwuhw7lt7ti2
    print(request.session._session_key) # w85oia6b5yqj5n2t6n7lpwuhw7lt7ti2
    print(request.session._get_session_key()) # w85oia6b5yqj5n2t6n7lpwuhw7lt7ti2
    return HttpResponse("Test")

而且,您可以按照以下示例在Django模板中使用request.session.session_key获取会话密钥:

{# "templates/index.html #}

{{ request.session.session_key }} {# w85oia6b5yqj5n2t6n7lpwuhw7lt7ti2 #}

-1

你也可以检查你的会话

If "var" in request.session:
       Var = request.session['var']
        Return httpResponse("set")
Else:
       Return httpResponse("there isn't")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接