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