request.POST與request.body:
django中的request.POST只能取到Content-Type(請求頭)為application/x-www-form-urlencoded(form表單默認格式)的數據,如果請求頭為application/json(json格式),multipart/form-data(文件)等格式無法取到,只有在request.body里面能取到原生的數據。當發送過來的是JSON數據是,request.POST取到的數據是空的,這時只有用request.body取,再反序列化才能使用。
HTTP協議:
請求首行:
請求方式、url路徑、HTTP協議版本
請求頭:
常見的請求頭有:
Content-Type:文本的數據類型
User-Agent:產生請求的瀏覽器類型
Host:發送請求的主機名
Accept:返回的數據格式
Server、Cookie等等。
請求體:
常見的請求方式:get、post、put、delete等
rest_framework中的解析器:
由request.data觸發
使用方法:與添加權限類一樣,只是解析器已經內置實現,選擇使用哪些解析器即可,這樣request.data就能取到POST請求發送的JSON、urlencoded、文件數據
class BookView(viewsets.ModelViewSet): authentication_classes = [utils.Authentication, ] # 認證組件,一個列表,類別中放認證類 permission_classes = [utils.PermissionCheck, ] # 權限組件, 一個列表, 列表中放權限類 throttle_classes = [utils.VisitThrottle, ] # 頻率組件 from rest_framework.parsers import JSONParser, MultiPartParser, FormParser parser_classes = [JSONParser, MultiPartParser, FormParser] # 解析器 queryset = models.Book.objects.all() serializer_class = serializers.BookSerializers
默認使用以下三種,一般情況不會動它。
上傳文件:
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'test/(?P<filename>[^/]+)', TestView.as_view(), name='test'), ]
#!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.request import Request from rest_framework.parsers import FileUploadParser class TestView(APIView): parser_classes = [FileUploadParser, ] def post(self, request, filename, *args, **kwargs): print(filename) print(request.content_type) # 獲取請求的值,並使用對應的JSONParser進行處理 print(request.data) # application/x-www-form-urlencoded 或 multipart/form-data時,request.POST中才有值 print(request.POST) print(request.FILES) return Response('POST請求,響應內容') def put(self, request, *args, **kwargs): return Response('PUT請求,響應內容')
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="http://127.0.0.1:8000/test/f1.numbers" method="post" enctype="multipart/form-data"> <input type="text" name="user" /> <input type="file" name="img"> <input type="submit" value="提交"> </form> </body> </html> upload.html