1. 程式人生 > 實用技巧 >小談Django中的response物件

小談Django中的response物件

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