1. 程式人生 > >Django-Rest frameworw之解析器

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字典型別的資料。 但