Django中response.set_cookie()与response.cookies[]的区别是什么?
在Django 4.2.1版本中,我们可以通过response.set_cookie()和response.cookies[]两种方式设置Cookie:
# "my_app1/views.py" from django.http import HttpResponse def test(request): response = HttpResponse('Test') response.set_cookie('first_name', 'John') # 通过set_cookie设置 response.cookies['last_name'] = 'Smith' # 通过直接操作cookies对象设置 return response

但使用response.delete_cookie()删除Cookie时,仅能删除通过response.set_cookie()设置的first_name,无法删除通过response.cookies[]设置的last_name:
# "my_app1/views.py" from django.http import HttpResponse def test(request): response = HttpResponse('Test') response.delete_cookie('first_name') # 成功删除 response.delete_cookie('last_name') # 无法删除 return response

核心区别
底层处理逻辑不同
response.set_cookie()是Django提供的高层封装方法,会严格遵循HTTP Cookie规范处理,自动初始化Cookie的max_age、expires、domain等标准属性(即使使用默认值,也会按规范完成配置),最终将Cookie信息以标准化形式存入response.cookies(一个SimpleCookie对象)。
而response.cookies[]是直接操作SimpleCookie的底层键值对,赋值时仅简单设置键和值,不会自动处理Cookie的标准属性,相当于写入原始的键值条目,缺少规范的属性标记。删除机制的适配性不同
response.delete_cookie()是专门配合set_cookie()设计的方法,它会生成符合HTTP删除标准的响应头(设置expires为过去时间、max_age=0等),且仅能匹配通过set_cookie()添加的、带有完整属性的Cookie条目。
直接通过response.cookies[]设置的Cookie,因缺少delete_cookie()所需的完整属性元数据,调用该方法时无法匹配到对应条目,也就无法完成删除操作。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

