Django Cookies,我该怎么设置它们?

时间:2009-10-26 02:06:28

标签: django cookies

我有一个网站,根据位置显示不同的内容 访客选择。例如:用户输入55812作为zip。我知道 城市和地区纬度/长。那就是给他们相关的内容 去那个地方。我的问题是如何将其存储在cookie中以便这样做 当他们返回时,他们不需要总是输入他们的邮政编码?

我看到如下:

  1. 根据区域设置持久性cookie。
  2. 当他们返回读取cookie时,请抓住zipcode。
  3. 根据Cookie中的邮政编码返回内容。
  4. 我似乎无法找到有关设置Cookie的任何可靠信息。任何 非常感谢帮助。

4 个答案:

答案 0 :(得分:228)

使用Django's session framework应涵盖大多数场景,但Django现在还在请求和响应对象上提供direct cookie manipulation methods(因此您不需要辅助函数)。

设置cookie:

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

检索cookie:

def view(request):
  if 'cookie_name' in request.COOKIES:
    value = request.COOKIES['cookie_name']

答案 1 :(得分:57)

这是设置持久性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's answer内置解决方案:

答案 2 :(得分:18)

您可以手动设置cookie,但根据您的使用情况(如果您可能希望将来添加更多类型的持久性/会话数据),使用Django's sessions feature可能更有意义。这将使get and set变量内部绑定到用户的会话cookie。关于这一点很酷的是,如果你想存储大量与用户会话相关的数据,将它们全部存储在cookie中将增加HTTP请求和响应的重量。对于会话,会话cookie就是来回发送的所有内容(尽管Django存储会话数据的开头需要记住)。

答案 3 :(得分:0)

任何对此感兴趣的人都应该阅读Django Sessions框架的文档。它将会话ID存储在用户的cookie中,但是将所有类似于cookie的数据映射到您的数据库。这是对典型的基于HTTP请求的基于cookie的工作流的改进。

这是一个带有Django视图的示例...

def homepage(request):

    request.session.setdefault('how_many_visits', 0)
    request.session['how_many_visits'] += 1

    print(request.session['how_many_visits'])

    return render(request, 'home.html', {})

如果您不断重复访问该页面,您会看到该值从1开始递增,直到您清除Cookie,使用新的浏览器访问,隐身或执行其他避开Django会话ID Cookie的操作为止。