【问题标题】:How can Django get session data in next request?Django 如何在下一个请求中获取会话数据?
【发布时间】:2021-10-17 18:04:57
【问题描述】:
def home(request):
    # logged in
    if request.user.is_authenticated:
        request.session['username'] = str(request.user)
        request.session.set_expiry(0)

    # anonymous
    else:
        # how could Django get session data here ?
        cur = request.session.get('username', None)
        if cur:
            pass
        else:
            anon = random.choice(settings.SESSION_NAMES)
            request.session['username'] = anon
            request.session.set_expiry(42)

    res = render(request, 'ex/home.html', {'username': request.session['username']})
    return res

我正在尝试了解会话。在上述匿名情况下,我将会话数据“用户名”设置为已获取的请求。在下一个请求中(刷新后),我可以获得会话数据。

但我不明白它是如何工作的。这是一个新请求,我在上一个请求中设置了“用户名”,而不是响应。

我如何从下一个请求对象中获取“用户名”,尽管没有将其设置为上一个响应对象?

【问题讨论】:

  • 会话数据存储在网络服务器的数据库中。通常,网络浏览器每次都会在请求中使用sessionid 发出请求,从而链接到存储在数据库中的会话数据。

标签: django session request response


【解决方案1】:

我如何从下一个请求对象中获取“用户名”,尽管没有将其设置为上一个响应对象?

会话数据不是由客户端存储,而是由服务器存储。存储在客户端的数据是 cookie。

Django 在浏览器中设置一个 cookie,默认命名为 sessionid(您可以通过更改 SESSION_COOKIE_NAME setting [Django-doc] 来更改它,因此它包含为该会话存储的会话数据的标识符。

因此,浏览器每次都会向sessionid 发出请求,如果您访问request.session,那么它会查看它存储在数据库中的内容。

您可以更改服务器存储 cookie 的方式以及使用的序列化程序。如需更多信息,请参阅How to use sessions section of the documentation

【讨论】:

  • 感谢您的回答。所以这是我的理解:1.request.session 在客户端的 cookie 中返回 sessionid。 2. 使用sessionid django 访问数据库。 3. 通过数据库中的 id 获取/设置会话数据。我理解对了吗?
  • @mishy: request.session 不返回会话 id,它是设置 cookie 的中间件。通常从您开始使用会话的那一刻起。
猜你喜欢
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2021-10-24
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
相关资源
最近更新 更多