【背景】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