姜戈饼干,我该怎么做?

我有一个网站,显示不同的内容基于一个位置 用户输入55812作为 zip,我知道是什么 城市和地区,也就是说,给他们相关的内容 我的问题是我怎样才能把它存储在饼干里 当他们返回时,他们不需要总是输入他们的邮政编码?

我认为如下:

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

我似乎找不到任何可靠的信息设置饼干。任何 非常感谢你的帮助。

162451 次浏览

您可以手动设置 cookie,但是根据您的用例(如果您将来可能希望添加更多类型的持久性/会话数据) ,使用 姜戈的会议专题可能更有意义。这将允许您在内部绑定到用户的会话 cookie 的 准备就绪变量。这样做的好处是,如果您想存储大量与用户会话相关联的数据,那么将这些数据全部存储在 cookie 中将为 HTTP 请求和响应增加很大的重量。对于会话,来回发送的只有会话 cookie (尽管在 Django 端存储会话数据需要记住一些开销)。

更新 : 查看下面的 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 的回答以获得内置解决方案:

使用 Django 的会话框架应该可以覆盖大多数场景,但是 Django 现在还在请求和响应对象上提供 直接的 cookie 操作方法(因此不需要 helper 函数)。

设置一个 cookie:

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

返回文章页面寻找饼干:

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

任何对此感兴趣的人都应该阅读 姜戈 · 塞申斯框架的文档。它在用户的 cookie 中存储会话 ID,但是将所有类似 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', {})

如果你一遍又一遍地访问这个页面,你会看到这个值从1开始递增,直到你清除你的 cookie,访问一个新的浏览器,隐藏身份,或者做任何可以避开 Django 的 Session ID cookie 的事情。

除了下面的 朱莉的回答之外,您还可以找到一个解决方案,显示如何将 cookie 设置为 基于类的视图响应。您可以将此解决方案应用于从 TemplateViewListViewView扩展的视图类。

下面是修改后的 Jujule 的持久 cookie setter 方法:

import datetime


from django.http import HttpResponse




def set_cookie(
response: HttpResponse,
key: str,
value: str,
cookie_host: str,
days_expire: int = 365,
):
max_age = days_expire * 24 * 60 * 60
expires = datetime.datetime.strftime(
datetime.datetime.utcnow() + datetime.timedelta(days=days_expire), "%a, %d-%b-%Y %H:%M:%S GMT",
)
domain = cookie_host.split(":")[0]
response.set_cookie(
key,
value,
max_age=max_age,
expires=expires,
domain=domain,
secure=False,
)

以及使用持久性 Cookie setter 添加 Cookie 的基于示例类的视图示例

class BaseView(TemplateView):
template_name = "YOUR_TEMPLATE_FILE_PATH"


def get(self, request, *args, **kwargs):
response = super().get(request, *args, **kwargs)
set_cookie(
response=response,
key="COOKIE_KEY",
value="COOKIE_VALUE",
cookie_host=request.get_host(),
days_expire=7,
)
return response