如何在Django中设置和获取cookies?
我有一个网站,可以根据访问者选择的位置显示不同的内容。比如说,用户输入了 55812
这个邮政编码。我知道这个邮政编码对应的城市和地区的经纬度,然后给他们提供相关的内容。我的问题是,怎么把这个信息存储在一个 cookie 里,这样他们下次回来时就不需要每次都输入邮政编码了?
我想的步骤是这样的:
- 根据他们所在的地区设置一个持久的 cookie。
- 当他们回来时,读取这个 cookie,获取邮政编码。
- 根据 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的回答,里面有一个内置的解决方案: