跳到主要内容

Django 操作 Cookie 和 Session

上一节介绍了 Cookie 和 Session 的相关概念,本节就要在 Django 中操作 Cookie 和 Session,同时我也会继续带领大家追踪相关的代码,这样可以更好的理解相关操作。

操作 Cookie 同样是考察4个基本动作:增删改查。现在分别从这4个角度看 Django 如何操作 Cookie :

:对于视图函数或者视图类的三种返回 Response 响应 (HttpResponse、render、redircet),之前的做法是直接 return,现在可以在 return 之前,使用 set_cookie() 或者 set_signed_cookied() 方法给客户端颁发一个 cookie,然后再带着颁发的 cookie 响应用户请求。操作代码结构如下。

def xxxx(request, \*args, \*\*kwargs):
# ...

rep = HttpResponse(...)
# 或者
rep = render(request, ...)
# 或者
rep = redirect( ...)

# 两种设置cookie的方法,一种不加salt,另一个加salt
rep.set_cookie(key, value,...)
rep.set_signed_cookie(key, value, salt='加密盐', max_age=None, ...)

return rep

:查询 cookie 是在发送过来的 HTTP 请求中的,因此对应的查询 Cookie 方法封装在 HttpRequest 类中,对应的操作语句如下:

request.COOKIES['key']
request.COOKIES.get['key']
# 对应前面使用前面加密的cookie
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

:调用前面的 set_cookie() 或者 set_signed_cookie() 方法修改 Cookie 即可;

:直接使用 HttpReponse 类的 delete_cookie() 删除 cookie 中对应 key 值。

案例1:Django 中 Cookie 实操。我们在前面的登录表单功能上改造视图函数,保证一次登录后,后续再次 GET 请求时能自动识别登录用户。此外还设置一个 Cookie 过期时间,过期之后再次 GET 请求时又回到登录页面。

调整登录表单的视图类:

class TestFormView2(TemplateView):
template_name = 'test\_form2.html'

def get(self, request, \*args, \*\*kwargs):
success = False
form = LoginForm()
print("[{}] cookies:{}".format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), request.COOKIES))
if request.get_signed_cookie('user', default='anonymous', salt=default_salt) == 'spyinx':
success = True
return self.render_to_response(context={'success': success, 'form': form})

def post(self, request, \*args, \*\*kwargs):
form = LoginForm(request.POST)
success = True
err_msg = ""
rep = self.render_to_response(context={'success': success, 'err\_msg': err_msg, 'form': form})
if form.is_valid():
login_data = form.clean()
name = login_data['name']
password = login_data['password']
if name != 'spyinx' or password != 'SPYinx123456':
success = False
err_msg = "用户名密码不正确"
else:
print('设置cookie')
rep.set_signed_cookie('user', 'spyinx', salt=default_salt, max_age=10)
else:
success = False
err_msg = form.errors['password'][0]
return rep

可以看到,在 get()方法中我们通过 get_signed_cookie() 方法获取 cookie 中的 user 信息,判断是否为 spyinx。若正确则返回成功登录的页面,否则返回登录页面。在 post() 方法中,对于登录成功的情况我们通过 set_signed_cookie() 方法颁发了一个 cookie 给客户端,并设置过期时间为10s,后续客户端的请求中都会自动带上这个 cookie。