Django-Rest frameworw之解析器
一、解析器
根據請求頭 content-type 選擇對應的解析器就請求體內容進行處理。
注意:個別特殊的值可以通過Django的request物件 request._request 來進行獲取
media_type = None # application/json application/x-www-form-urlencoded multipart/form-data等 #根據這個匹配使用哪個解析器
def parse(self, stream, media_type=None, parser_context=None): #關鍵方法pass
二、解析器示例
==============******==============
1、僅處理請求頭content-type為application/json的請求體
2、僅處理請求頭content-type為application/x-www-form-urlencoded 的請求體
3、僅處理請求頭content-type為multipart/form-data的請求體
4、 僅上傳檔案
5、 同時多個Parser
==============******==============
全域性使用
in settings.py #直接copy REST_FRAMEWORK到配置檔案就行 REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES':[ 'rest_framework.parsers.JSONParser' #使用的解析器 'rest_framework.parsers.FormParser' 'rest_framework.parsers.MultiPartParser' ] }
1、僅處理請求頭content-type為application/json的請求體
in urls.py from django.conf.urls import url, include from web.views.s5_parser import TestView urlpatterns = [ url(r'test/', TestView.as_view(), name='test'), ] in views.py #!/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 JSONParser class TestView(APIView): parser_classes = [JSONParser, ] def post(self, request, *args, **kwargs): 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請求,響應內容')
2、僅處理請求頭content-type為application/x-www-form-urlencoded 的請求體
in urls.py
from django.conf.urls import url, include
from web.views import TestView
urlpatterns = [
url(r'test/', TestView.as_view(), name='test'),
]
in views.py
#!/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 FormParser
class TestView(APIView):
parser_classes = [FormParser, ]
def post(self, request, *args, **kwargs):
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請求,響應內容')
3、僅處理請求頭content-type為multipart/form-data的請求體
in urls.py
from django.conf.urls import url, include
from web.views import TestView
urlpatterns = [
url(r'test/', TestView.as_view(), name='test'),
]
in views.py
#!/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 MultiPartParser
class TestView(APIView):
parser_classes = [MultiPartParser, ]
def post(self, request, *args, **kwargs):
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請求,響應內容')
in upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://127.0.0.1:8000/test/" method="post" enctype="multipart/form-data">
<input type="text" name="user" />
<input type="file" name="img">
<input type="submit" value="提交">
</form>
</body>
</html>
4、 僅上傳檔案
in urls.py
from django.conf.urls import url, include
from web.views import TestView
urlpatterns = [
url(r'test/(?P<filename>[^/]+)', TestView.as_view(), name='test'),
]
in views.py
#!/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請求,響應內容')
in upload.html
<!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>
5、 同時多個Parser
當同時使用多個parser時,rest framework會根據請求頭content-type自動進行比對,並使用對應parser
in urls.py
from django.conf.urls import url, include
from web.views import TestView
urlpatterns = [
url(r'test/', TestView.as_view(), name='test'),
]
in views.py
#!/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 JSONParser, FormParser, MultiPartParser
class TestView(APIView):
parser_classes = [JSONParser, FormParser, MultiPartParser, ]
def post(self, request, *args, **kwargs):
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請求,響應內容')
相關推薦
Django-Rest frameworw之解析器
一、解析器 根據請求頭 content-type 選擇對應的解析器就請求體內容進行處理。 注意:個別特殊的值可以通過Django的request物件 request._request 來進行獲取media_type = None # applica
django rest framework 之 解析器
quest code amp cati bmi name parse 內部 表單提交 一、前言 在前端向後臺發送form表單或者ajax數據的時候,django的content_type會拿到請求頭中的Content-Type屬性然後根據值進行解析。 將request.da
django rest framework之解析器的原始碼流程剖析
在初始化Request的時候: 1 def initialize_request(self, request, *args, **kwargs): 2 """ 3 Returns the initial request object. 4
DRF Django REST framework 之 解析器(二)
引入 Django Rest framework幫助我們實現了處理application/json協議請求的資料,如果不使用DRF,直接從 request.body 裡面拿到原始的客戶端請求的位元組資料,經過 decode ,然後 json 反序列化
rest-framework之解析器
目錄 一 直譯器的作用 二 全域性使用直譯器 三 區域性使用直譯器 四 原始碼分析 一 直譯器的作用 根據請求頭 content-type 選擇對應的解析器對請求體內容進行處理。 有application/json(json格式字串),x-www-for
Django-Rest frameworw之路由系統
路由系統============******============ 一、 自定義路由 二、 半自動路由 三、 全自動路由========
Django之解析器
一、什麼是解析器? 對請求的資料進行解析 - 請求體進行解析。 解析器在你不拿請求體資料時 不會呼叫。 class UsersView(APIView): def get(self,request,*args,**kwargs): return Response('..
DRF Django REST framework 之 頻率,響應器與分頁器元件(六)
頻率元件 頻率元件類似於許可權元件,它判斷是否給予請求通過。頻率指示臨時狀態,並用於控制客戶端可以向API發出的請求的速率。 與許可權一樣,可以使用多個調節器。API可能會對未經身份驗證的請求進行限制,而對於經過身份驗證的請求則進行限制較少。 例如,可以將使用者限制為每分鐘最多60個請求,每天最多1000個請
rest-framework框架 -- 解析器、分頁、路由
表示 color 組件 elf post data ... rest art rmp 解析器 :reqest.data取值的時候才執行 對請求的數據進行解析:是針對請求體進行解析的。表示服務器可以解析的數據格式的種類 django中的發送請求 #如果是這樣的格式發送的數據
rest_framework之解析器、路由控制、分頁
控制 img 其他 http 只需要 api 參數 字符 route 解析器 我們都知道,網絡傳輸數據只能傳輸字符串格式的,如果是列表、字典等數據類型,需要轉換之後才能使用 但是我們之前的rest_framework例子都沒有轉換就直接可以使用了,這是因為rest_fr
設計模式---領域規則模式之解析器模式(Interpreter)
語法規則 規則 urn air 業務 變化 img bsp span 前提:領域規則模式 在特定領域內,某些變化雖然頻繁,但可以抽象為某種規則。這時候,結合特定領域,將問題抽象為語法規則,從而給出該領域下的一般性解決方案。 典型模式 解析器模式:Inter
MySQL內核源碼解讀-SQL解析之解析器淺析
ado limit ast group 指令 short ring token erl MYSQL服務器接收SQL格式的查詢,首先要對sql進行解析,內部將文本格式轉換為二進制結構,這個轉換就是解析器,解析的目的是為了讓優化器更好的處理指令,以便以最優的路徑,最少的耗時返回
django rest framework 之 版本
一、前言 1、版本的重要性 在RESTful 規範中,有關版本的問題,用restful規範做開放介面的時候,使用者請求API,系統返回資料。但是難免在系統發展的過程中,不可避免的需要新增新的資源,或者修改現有資源。因此,改動升級必不可少,但是,作為平臺開發者,應該知道:一旦你的API開放出去,有人開始用了
django rest framework 之 檢視
在之前的django rest framework其他元件中,在檢視函式中繼承類都是rest_framework.view.APIView,這個APIView是繼承的django中的View並且做了封裝和方法重寫的。 那麼在django rest framework中,還有有沒有提供其他的類能夠繼承? 一、
django rest framework_jwt之認證的源碼流程剖析
.data string with mission default nta status objects mar 視圖代碼 1 class UserViewset(BaseView): 2 ‘‘‘ 3 create: 4 創
django rest framework_jwt之認證的原始碼流程剖析
檢視程式碼 1 class UserViewset(BaseView): 2 ''' 3 create: 4 建立使用者 5 retrieve: 6 7 ''' 8 queryset = User.objects
django rest framework之節流的原始碼流程剖析
檢視類: 1 class UserViewset(BaseView): 2 ''' 3 create: 4 建立使用者 5 retrieve: 6 7 ''' 8 queryset = User.objects.
django rest framework之版本的原始碼流程剖析
和之前的認證一樣在initial函式中: 1 def initial(self, request, *args, **kwargs): 2 """ 3 Runs anything that needs to occur prior to calling t
django rest framework之序列化的原始碼流程剖析
當要對資料物件進行序化列例項化的時候 1 def __new__(cls, *args, **kwargs): 2 # We override this method in order to automagically create 3 # `ListSeria
DRF之解析器元件及序列化元件
引入 Django RestFramework幫助我們實現了處理application/json協議請求的資料,另外,我們也提到,如果不使用DRF,直接從request.body裡面拿到原始的客戶端請求的位元組資料,經過decode,然後json反序列化之後,也可以得到一個Python字典型別的資料。 但