如何在Django中设置和获取cookies?

159 投票
6 回答
183736 浏览
提问于 2025-04-15 15:22

我有一个网站,可以根据访问者选择的位置显示不同的内容。比如说,用户输入了 55812 这个邮政编码。我知道这个邮政编码对应的城市和地区的经纬度,然后给他们提供相关的内容。我的问题是,怎么把这个信息存储在一个 cookie 里,这样他们下次回来时就不需要每次都输入邮政编码了?

我想的步骤是这样的:

  1. 根据他们所在的地区设置一个持久的 cookie。
  2. 当他们回来时,读取这个 cookie,获取邮政编码。
  3. 根据 cookie 中的邮政编码返回相应的内容。

我找不到关于如何设置 cookie 的具体信息,任何帮助都非常感谢。

6 个回答

19

你可以手动设置cookie,但根据你的具体需求(还有将来可能想添加更多类型的持久数据或会话数据),使用Django的会话功能可能更合适。这让你可以获取和设置与用户会话cookie相关的变量。这个功能的好处是,如果你想存储很多与用户会话相关的数据,把所有数据都放在cookie里会让HTTP请求和响应变得很重。而使用会话的话,来回传输的只会是会话cookie(不过要记得Django那边需要存储会话数据,这会有一些额外的开销)。

309

使用Django的会话框架可以满足大多数情况,但Django现在也提供了直接操作cookie的方法,可以在请求和响应对象上使用(这样你就不需要额外的辅助函数了)。

设置一个cookie:

def view(request):
  response = HttpResponse('blah')
  response.set_cookie('cookie_name', 'cookie_value')

获取一个cookie:

def view(request):
  value = request.COOKIES.get('cookie_name')
  if value is None:
    # Cookie is not set

  # OR

  try:
    value = request.COOKIES['cookie_name']
  except KeyError:
    # Cookie is not set
87

更新 : 请查看下面的Peter的回答,里面有一个内置的解决方案:

这是一个帮助设置持久性cookie的工具:

import datetime

def set_cookie(response, key, value, days_expire=7):
    if days_expire is None:
        max_age = 365 * 24 * 60 * 60  # one year
    else:
        max_age = days_expire * 24 * 60 * 60
    expires = datetime.datetime.strftime(
        datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age),
        "%a, %d-%b-%Y %H:%M:%S GMT",
    )
    response.set_cookie(
        key,
        value,
        max_age=max_age,
        expires=expires,
        domain=settings.SESSION_COOKIE_DOMAIN,
        secure=settings.SESSION_COOKIE_SECURE or None,
    )

在发送响应之前,使用以下代码。

def view(request):
    response = HttpResponse("hello")
    set_cookie(response, 'name', 'jujule')
    return response

更新 : 请查看下面的Peter的回答,里面有一个内置的解决方案:

撰写回答