如何找出 request.session sessionid 并将其用作变量?

Posted

技术标签:

【中文标题】如何找出 request.session sessionid 并将其用作变量?【英文标题】:How can I find out the request.session sessionid and use it as a variable? 【发布时间】:2010-10-06 06:52:01 【问题描述】:

我知道您可以使用request.session['variable_name'] 获取会话变量,但似乎没有办法以类似的方式将会话 ID 作为变量获取。这在任何地方都有记录吗?没找到。

【问题讨论】:

【参考方案1】:
request.session.session_key

请注意,只有在有会话、没有密钥、没有会话时,密钥才会存在。您可以使用它来测试会话是否存在。如果要创建会话,请调用 create。

【讨论】:

@aehike: request.session._session_key 根据@Vinicius 的回答 request.session.session_key 在 Django 1.6 中运行良好。 request.session.session_key 在 Django 1.7 中也可以正常工作。 我更喜欢使用request.session._get_or_create_session_key(),因为可能还没有ID。 这是否有效完全取决于会话是否已创建。看我的回答【参考方案2】:

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

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

【讨论】:

如果会话密钥不存在,这将无济于事。【参考方案3】:

在 Django >= 1.4 中使用:

request.session._session_key

【讨论】:

呃,私有变量(以下划线开头的变量)的主要目的是您应该使用它们。 @MichałGórny 那么有什么选择呢?如果没有,我看不出我们有什么选择…… 另一种方法是编写适当的代码。如果 django 没有提供一个 public API 来获取会话密钥,那仅仅意味着你不应该使用那个密钥。如果不知道您到底想做什么,我无法告诉您更多信息,但它可能是一个单独问题的字段。【参考方案4】:

这将为您获取会话 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()

【讨论】:

【参考方案5】:

要可靠地获取会话密钥,您需要确保首先创建了会话。 The documentation 提到了一个 .create() 会话方法,可用于确保有会话密钥:

def my_view(request):
    if not request.session.session_key:
        request.session.create()

    print(request.session.session_key)

【讨论】:

【参考方案6】:

用途:

request.COOKIES['sessionid']

【讨论】:

【参考方案7】:

在 Django 1.8 中:

request.session.session_key

request.session._session_key

两者都能正常工作。

【讨论】:

【参考方案8】:

您也可以签入您的会话

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

【讨论】:

以上是关于如何找出 request.session sessionid 并将其用作变量?的主要内容,如果未能解决你的问题,请参考以下文章

在django中,request.session.set_expiry是如何使用idle后注销用户的?

如何清除所有会话变量而不退出

Laravel 5.2 会话闪存即使使用 Web 中间件也无法正常工作

在Struts2的Action中获得request response session几种方法

如何在不注销的情况下清除所有会话变量

有时 request.session.session_key 是 None