4.2 JSON数据
4.2.1 Postman发送JSON数据
JSON字符串必须使用双引号,JSON与字典类似
{ "username":"zszs", "pwd":"123123" }
4.2.2 服务器获取传递的JSON数据
服务器获取传递的JSON数据,使用request.body
.
json模块:
json.dumps
:将字典转换为JSON字符串json.loads
:将JSON字符串转换为字典
from django.shortcuts import render from django.http import HttpRequest from django.http import HttpResponse import json # Create your views here. def login(request): # JSON数据在request的body中 # 获取传递的JSON数据 body = request.body print(body) # 传递过来的数据为二进制,对传递的数据进行解码 body_str = body.decode() print(body_str, type(body_str)) # 解码后的数据为JSON字符串,转换为字典 body_dic = json.loads(body_str) print(body_dic, type(body_dic)) return HttpResponse('收到')
5. 获取请求头传递的数据
获取通过请求头传递过来的数据,使用request.MATE
进行获取请求头headers中的数据,request.META
为字典类型。
from django.shortcuts import render from django.http import HttpRequest from django.http import HttpResponse import json # Create your views here. def login(request): # 获取请求头 request_header = request.META print(request_header) print(type(request_header)) # 由于请求头是字典类型 # 获取请求发送过来的文本的文本类 print(request_header['CONTENT_TYPE']) return HttpResponse('收到')
6. 其他常用HttpRequest对象属性
- method:一个字符串,表示请求使用的HTTP方法,常用值包括:‘GET’、‘POST’。
- user:请求的用户对象。
- path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
- encoding:一个字符串,表示提交的数据的编码方式。
- 如果为None则表示使用浏览器的默认设置,一般为utf-8。
- 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
- FILES:一个类似于字典的对象,包含所有的上传文件。
from django.shortcuts import render from django.http import HttpRequest from django.http import HttpResponse import json # Create your views here. def login(request): # 获取浏览器发送请求的请求类型 print(request.method) # 获取所有的上传文件 print(request.FILES) return HttpResponse('收到')
7. HttpResponse对象
视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。
7.1 HttpResponse
可以使用django.http.HttpResponse
来构造响应对象。
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
- 可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码:
- content:表示返回的内容。
- 默认传递字符串,不要传递对象、字典等数据
- content_type:响应体数据类型
- 这是一个MIME类型,语法形式:大类/小类,
- 常见的响应体数据类型,text/html、text/css、text/javascript、application/json、image/png、image/gif、image/jpeg。
- MIME类型参考手册:https://www.runoob.com/http/mime-types.html、https://www.w3school.com.cn/media/media_mimeref.asp
- status:返回的HTTP响应状态码。
- 响应状态码必须要在100到599之间。
- 只能使用系统规定的。
- 响应状态码参考手册:https://www.runoob.com/http/http-status-codes.html、https://seo.juziseo.com/doc/http_code/
from django.shortcuts import render from django.http import HttpRequest from django.http import HttpResponse import json # Create your views here. def login(request): data = { 'name': 'zszs' } return HttpResponse(data)
from django.shortcuts import render from django.http import HttpRequest from django.http import HttpResponse import json # Create your views here. def login(request): obj = object() return HttpResponse(obj)
from django.shortcuts import render from django.http import HttpRequest from django.http import HttpResponse import json # Create your views here. def login(request): return HttpResponse('收到请求')
7.2 JsonResponse
JsonResponse为HttpResponse的子类对象。
若要返回json数据,可以使用JsonResponse来构造响应对象。
JsonResponse的作用:
1.帮助我们将数据转换为json字符串
2.设置响应头Content-Type为application/json
from django.shortcuts import render from django.http import HttpRequest from django.http import HttpResponse from django.http import JsonResponse import json # Create your views here. def login(request): data = { 'name': 'zszszs' } return JsonResponse(data)
7.3 HttpResponse的其他子类
Django提供了一系列HttpResponse的子类,可以快速设置状态码
- HttpResponseRedirect 301
- HttpResponsePermanentRedirect 302
- HttpResponseNotModified 304
- HttpResponseBadRequest 400
- HttpResponseNotFound 404
- HttpResponseForbidden 403
- HttpResponseNotAllowed 405
- HttpResponseGone 410
- HttpResponseServerError 500
8. 重定向
在浏览器向服务器发送请求成功后,可以将页面重定向到其他的页面或网址。如:用户进行登录,登录成功后跳转到首页,可以使用重定向。
进行重定向使用redirect()
。
redirect()
的导入:
from django.shortcuts import redirect
from django.shortcuts import render from django.http import HttpRequest from django.http import HttpResponse from django.http import JsonResponse from django.shortcuts import redirect from django.urls import reverse import json # Create your views here. def login(request): # 请求成功,进行页面跳转 # 跳转到book/index # 由于对路由起了命名空间和路由命名 # path('book/', include(('book.urls', 'book'), namespace='book')) # path('index/', index, name='index') # 动态获取路由 redirect_path = reverse('book:index') return redirect(redirect_path)