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

Jef*_*rey 116 django cookies

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

我看到如下:

  1. 根据区域设置持久性cookie.
  2. 当他们返回读取cookie时,抓住zipcode.
  3. 根据Cookie中的邮政编码返回内容.

我似乎无法找到有关设置cookie的任何可靠信息.任何帮助是极大的赞赏.

小智 244

使用Django的会话框架应涵盖大多数场景,但Django现在还在请求和响应对象上提供直接的cookie操作方法(因此您不需要辅助函数).

设置cookie:

def view(request):
  response = HttpResponse('blah')
  response.set_cookie('cookie_name', 'cookie_value')
Run Code Online (Sandbox Code Playgroud)

检索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
Run Code Online (Sandbox Code Playgroud)

  • 更pythonic的方式是调用request.COOKIES.get('cookie_name') (11认同)
  • 只是要更新 - 'has_key'已被'in'取代. (9认同)
  • 如果您想知道如何从 Django 请求对象创建 Django 响应对象,请阅读:/sf/ask/1194027551/ -模板 (4认同)

juj*_*ule 65

这是设置持久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)
Run Code Online (Sandbox Code Playgroud)

发送响应之前,请使用以下代码.

def view(request):
  response = HttpResponse("hello")
  set_cookie(response, 'name', 'jujule')
  return response
Run Code Online (Sandbox Code Playgroud)

更新:检查Peter的答案,以获得内置解决方案:

  • -1,在那,django带有一个设置cookie的方法https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpResponse.set_cookie (11认同)
  • 我不在乎,但是,fyi:无用的辅助功能在2009年已经无用了.https://docs.djangoproject.com/en/1.0/ref/request-response/#django.http.HttpResponse.set_cookie(django 1.0 was据我所知,2008年9月发布) (5认同)
  • @klemens:是的,我终于在我的例子中调用了django方法; 它只是简化日期处理的捷径(从2009年开始). (2认同)

Ben*_*pan 18

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

  • 好点子!请注意,您可以通过在单独的域(而不是子域)上托管静态内容来减少HTTP权重,以便不会在这些请求上发送cookie.http://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site/305381#305381 (3认同)

Chr*_*lan 7

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

这是一个 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', {})
Run Code Online (Sandbox Code Playgroud)

如果您一遍又一遍地继续访问该页面,您将看到该值从 1 开始递增,直到您清除 cookie、在新浏览器上访问、隐身或执行任何其他绕过 Django 会话 ID cookie 的操作。