小談Django中的response物件
阿新 • • 發佈:2020-10-12
response物件
最常用的三個response物件
- HttpResponse('xxx') HttpResponse物件 , 返回字串 ;
- render(request, '模板的路徑', {}) 返回一個頁面 ;
- redirect('路徑') 重定向 : 對這個路徑再發出一次請求 ;
render和redirect的本質都是HttpResponse物件 :
render返回的是一個頁面 ;
redirect的本質就是HttpResponse物件加上一個狀態碼( 301 , 302 )和響應頭 ;
return redirect(url) # 上面的程式碼等價下面的程式碼 ret = HttpResponse(status=301) ret['location'] = url return ret
JsonResponse物件
JsonResponse : 直接返回前端資料 , 而不是頁面
使用場景 : 專案用前後端分離時 , 後端只做邏輯 , 前端有專業前端工程師做 , 後端返回的都是資料 , 前端拿到資料再去渲染 .
示例 :
# views.py from django.http.response import JsonResponse def get_data(request): ret = {'name' : 'alex', 'pwd':'dsb'} # ret = [1, 2, 3] # return JsonResponse(ret, safe=false) return JsonResponse(ret) # 前端頁面顯示: {'name' : 'alex', 'pwd':'dsb'}
- Response Headers 中的 Content-Type : "application/json" ; 這種型別的話 , 前端會自動進行反序列化直接拿到資料(一個字典)( 本應該 : 後端先做序列化變成普通字串 , 再進行encode編碼設定拿到位元組 ; 前端拿到資料後先進行解碼成普通字串, 再進行反序列化拿到正常資料(一個字典) , 才能拿到正常資料 ) ;
- 如果序列化的資料型別是 非字典但是可以被json序列化的 資料型別時 , 會報錯 : " 非字典的資料在序列化時要指定safe=false ; "
JsonResponse本質 : 還是HttpResponse
示例 :
from django.http.response import JsonResponse
def get_data(request):
ret = {'name' : 'alex', 'pwd':'dsb'}
rerurn HttpResponse(ret)
# 前端頁面顯示的是: namepwd
# --------------------------------------------------
import json
from django.http.response import JsonResponse
def get_data(request):
ret = {'name' : 'alex', 'pwd':'dsb'}
rerurn HttpResponse(json.dumps(ret))
# 前端頁面顯示: {'name' : 'alex', 'pwd':'dsb'}
# 但是Content-Type : "text/html" ; charset='utf-8' ; 相當於前端拿到的還是普通字串 , 還需要前端自己做反序列化
# -------------------------------------------------------------
import json
from django.http.response import JsonResponse
def get_data(request):
ret = {'name' : 'alex', 'pwd':'dsb'}
rerurn HttpResponse(json.dumps(ret), content-type="application/json")
# 這次結果就和JsonResponse一樣了 : 這個示例就說明了JsonResponse的本質 , 還是HttpResponse