Django JsonResponse 不自動設置 cookie 的解決方案

背景python

目前在作一個先後端分離的 web 項目,後端使用的是 django 框架,全部的 API 都只返回 json ;就在這個過程當中遇到了一個問題,那就是對於全部的 JsonResponse django 都不會主動設置 response 對象的 cookies ,這個就進一步使得 csrftoken 這個 cookie 值永遠不會出如今 response 中。web

 

二、解決方案一sql

這個方案的解決思路是:既然 django 不主動的去設置 csrftoken 的值,乾脆本身設置它。django

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 的客戶端程序json

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 做爲了業務邏輯的一部分,不方便維護。cookie

 

三、解決方案二session

這個方案的解決思路是:直接使用 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

相關文章
相關標籤/搜索