小谈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
原文地址:https://www.cnblogs.com/richard_A/p/13804963.html