Django JsonResponse 不自动设置 cookie 的解决方案

背景

目前在做一个前后端分离的 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

 

posted on   蒋乐兴的技术随笔  阅读(879)  评论(3编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2016-07-18 MySQL--mysqldump的权限说明
2016-07-18 JS--switch 语句

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示