我有一个网站,根据访问者选择的位置显示不同的内容。例如:用户输入55812
作为邮编。我知道对应的城市和地区的经纬度,并提供与该地区相关的内容。我的问题是,我如何将这些信息存储在cookie中,以便当他们返回时不需要始终输入他们的邮编?
我将其分解如下:
- 基于他们的地区设置持久性cookie。
- 当他们返回时读取cookie,获取邮编。
- 根据他们cookie中的邮编返回相应的内容。
我似乎找不到关于设置cookie的确切信息。非常感谢任何帮助。
我有一个网站,根据访问者选择的位置显示不同的内容。例如:用户输入55812
作为邮编。我知道对应的城市和地区的经纬度,并提供与该地区相关的内容。我的问题是,我如何将这些信息存储在cookie中,以便当他们返回时不需要始终输入他们的邮编?
我将其分解如下:
我似乎找不到关于设置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
更新:请查看下面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 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 的 Session ID cookie 的任何操作。
TemplateView
,ListView
或View
的视图类。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设置器添加一个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
response.cookies[]
。我曾经问过这个问题,关于如何正确地将字典或列表设置为cookie并获取它,你可以看到我的答案解释了如何删除cookie。
from django.shortcuts import render
def my_view(request):
response = render(request, 'index.html', {})
response.set_cookie('name', 'John')
response.cookies['age'] = 27
return response # Must return the object
render_to_string(), HttpResponse() and set_cookie():
from django.template.loader import render_to_string
from django.http import HttpResponse
def my_view(request):
rts = render_to_string('index.html', {})
response = HttpResponse(rts)
response.set_cookie('name', 'John')
response.cookies['age'] = 27
return response # Must return the object
from django.http import HttpResponse
def my_view(request):
response = HttpResponse('View')
response.set_cookie('name', 'John')
response.cookies['age'] = 27
return response # Must return the object
from django.shortcuts import redirect
def my_view(request):
response = redirect('https://example.com/')
response.set_cookie('name', 'John')
response.cookies['age'] = 27
return response # Must return the object
HttpResponseRedirect()和set_cookie():
from django.http import HttpResponseRedirect
def my_view(request):
response = HttpResponseRedirect('https://example.com/')
response.set_cookie('name', 'John')
response.cookies['age'] = 27
return response # Must return the object
而且,您可以像下面显示的那样通过request.COOKIES['key']和request.COOKIES.get('key')获取到cookie。request.COOKIES.get()
默认情况下返回None
,如果键不存在,您可以将None
更改为其他值,例如将其设置为第二个参数中的Doesn't exist
,如下所示:
from django.shortcuts import render
def my_view(request):
print(request.COOKIES['name']) # John
print(request.COOKIES.get('age')) # 27
print(request.COOKIES.get('gender')) # None
print(request.COOKIES.get('gender', "Doesn't exist")) # Doesn't exist
return render(request, 'index.html', {})
而且,在Django模板中,您可以使用request.COOKIES.key
获取cookie,如下所示:
# "templates/index.html"
{{ request.COOKIES.name }} {# John #}
{{ request.COOKIES.age }} {# 27 #}
from django.shortcuts import render
def my_view(request):
response = render(request, 'index.html', {})
response.delete_cookie('name')
response.delete_cookie('age')
return response # Must return the object