背景

目前在做一个前后端分离的 web 项目,后端使用的是 django 框架,所有的 API 都只返回 json ;就在这个过程中遇到了一个问题,那就是对于所有的 JsonResponse django 都不会主动设置 response 对象的 cookies ,这个就进一步使得 csrftoken 这个 cookie 值永远不会出现在 response 中。

2、解决方案一

这个方案的解决思路是:既然 django 不主动的去设置 csrftoken 的值,干脆自己设置它。

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie
class GetIDCView(View):
"""
实现 IDC 信息的查询
"""
def get(self,request,pk):
logger.debug(f"查询所有的 idc ")
qs = IDC.objects.all().values('name','city','id')
# 把 QuerySet 变成列表
_lqs = [i for i in qs]
rst = {
'message': '',
'code': 0,
}
rst['data'] = {
'idcs': _lqs
}
response = JsonResponse(rst)
# 手功完成 set_cookie
response.set_cookie('csrftoken','csrf-token-value')
return response

写一个用于检查 cookie 的客户端程序

import requests

if __name__ == "__main__":
session = requests.Session()
response = session.get("http://127.0.0.1:8080/hosts/idcs/")
print(response.cookies)

查看返回的 cookie 值

python3 getcookie.py
< RequestsCookieJar[ < Cookie csrftoken=csrf-token-value for 127.0.0.1/ > ] >

这个方案存在的问题:把设置 cookie 作为了业务逻辑的一部分,不方便维护。

3、解决方案二

这个方案的解决思路是:直接使用 django 使用的提供的装饰器,这个方案在 django 的官方文档上只是简单的提了一下(只有四行字),所以它的难点在于有没有认真的看过官方文档

from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie class GetIDCView(View):
"""
实现 IDC 信息的查询
"""
@method_decorator(ensure_csrf_cookie)
def get(self,request,pk):
# 如果 pk == None 说明是要查询出所有的 IDC 实例
logger.debug(f"查询所有的 idc ")
qs = IDC.objects.all().values('name','city','id')
# 把 QuerySet 变成列表
_lqs = [i for i in qs]
rst = {
'message': '',
'code': 0,
}
rst['data'] = {
'idcs': _lqs
}
return JsonResponse(rst)

查看效果

python3 getcookie.py
< RequestsCookieJar[< Cookie csrftoken=iQQhG2NETVTDnWTAVYBXji1ehLdWesKIGCCxTC1icyIapoS6LrpdUYOZc39qJsto for 127.0.0.1/ > ] >

这个方案的好处在于 View 只要处理业务逻辑就行了。

引用自:https://www.sqlpy.com/blogs/books/2/chapters/15/articles/53

Django JsonResponse 不自动设置 cookie 的解决方案的更多相关文章

  1. Django中的session和cookie及分页设置

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  2. 关于启明星系统移除apppath配置,让系统自动获取路径来设置cookie的解决方法

    启明星系统底层使用统一接口,特别是用户,用户登录后,都会建立一个 userinfo 的cookie.请看下面2个网址: http://120.24.86.232/book http://120.24. ...

  3. django设置cookie和session

    1 设置cookie 本例中应用名称为cookie 模型model from django.db import models from django.db import models class Us ...

  4. Laravel5 cookie和session设置 Cookie::queue()自动添加

    Cookies Laravel会加密所有已创建的cookie信息,并附加上授权码,当客户端擅自修改cookie信息时,该cookie将被废弃,从而保证安全性. 获取一个指定的cookie值 $valu ...

  5. Python开发【Django】:分页、Cookie和Session

    分页 1.简单分页 涉及xss攻击,需要用到mark_safe方法,使用此方法字符串传输到后端后,已html形式显示,而非字符串 HTML文件: <!DOCTYPE html> <h ...

  6. Django值聚合,分组,事物,cookie,session

    1,聚合(aggregate):是queryset的一个 终止语句,它返回一个包含键值对的字典,键是的名称是聚合值的标识符,值是计算出来的聚合值,键的名称是按照字段和聚合函数自动生成出来的.用到的内置 ...

  7. Django -聚合分组,FQ操作, cookie, session

    一. 聚合查询和分组 1. 聚合 aggregate(*args, **kwargs) 对一组数据进行统计分析, 通过对QuerySet进行计算, 返回一个聚合值得字典. arrgregate()中每 ...

  8. 转载:postman自动设置token(csrf及authorization token)

    原文链接: https://knktc.com/2018/06/03/postman-set-token/ 正文引用: 近期在开发一个Django的项目,由于开启了csrf防护,所以需要在请求的hea ...

  9. Django框架(十一)--cookie和session

    cookie和session组件 cookie 1.cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它 ...

随机推荐

  1. Codeforces 7E - Defining Macros 题解

    目录 Codeforces 7E - Defining Macros 题解 前言 做法 程序 结尾 Codeforces 7E - Defining Macros 题解 前言 开始使用博客园了,很想写 ...

  2. jquery dialog的一些坑

    jquery dialog工具可以方便的生成一个弹出框,但是在一些需要多个弹出框的应用场景上会有一些bug 具体场景: 当使用过一次模态框之后,使用另外的一个模态框时,已经消失不见的模态框会重新出来 ...

  3. Vue.js学习笔记--菜鸟搭建一个企业级vue的项目

    vue.js新手搭建一个企业项目,从0开始 前置条件: node.npm请先安装配置好 下面开始: npm 下载vue-cli脚手架工具  确认安装成功看到版本号: 初始化项目,选用webpack(p ...

  4. java8-计算时间差的方法

    一.简述 在Java8中,我们可以使用以下类来计算日期时间差异: 1.Period 2.Duration 3.ChronoUnit 二.Period类 主要是Period类方法getYears(),g ...

  5. SpringBoot:CORS处理跨域请求的三种方式

    一.跨域背景 1.1 何为跨域? Url的一般格式: 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 示例: https://www.dustyblog.cn:8080/say/Hel ...

  6. Repeater嵌套

    我们自己观察 这是由两个重复项组成的 重复项包含重复项 而重复项的数据源是由订单号决定 即父Repeater的某数据源字段 protected void Repeater1_ItemDataBound ...

  7. SpringBoot配置文件yml ScannerException: while scanning an alias *

    在使用yml编写配置我呢见 management: endpoints: web: base-path: /actuator jmx: exposure: include: * 报了如下错误 解决方案 ...

  8. 【C#】学习笔记(3) 关于Events使用的小Demo

    关于Events事件的简单Demo. 目录结构: Program.cs using System; namespace EventsDemo { class Program { static void ...

  9. windows 应急流程及实战演练

    前言 本文摘自信安之路公众号的文章. 当企业发生黑客入侵.系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事 ...

  10. 对vue-cli各个目录的理解 和 在 vue 中使用json-server

    看了几章书,看到了vue模板,看不下去哦,就找了一个B站的vue视频来看,下面进行总结. 学习一个语言,框架,CRUD..先学会. 重点就是最为常用的几个语句.学得不多,感慨挺多.. 前提:下载好vu ...