解析器:request.body、request.POST、request.data


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

 

 

 

 

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM