日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django REST framework 解析器和渲染器

發(fā)布時(shí)間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django REST framework 解析器和渲染器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

解析器的作用

解析器的作用就是服務(wù)端接收客戶端傳過來的數(shù)據(jù),把數(shù)據(jù)解析成自己可以處理的數(shù)據(jù)。本質(zhì)就是對(duì)請(qǐng)求體中的數(shù)據(jù)進(jìn)行解析。

在了解解析器之前,我們要先知道Accept以及ContentType請(qǐng)求頭。

  • Accept是告訴對(duì)方我能解析什么樣的數(shù)據(jù),通常也可以表示我想要什么樣的數(shù)據(jù)。
  • ContentType是告訴對(duì)方我給你的是什么樣的數(shù)據(jù)類型。

解析器工作原理的就是拿到請(qǐng)求的ContentType來判斷前端給我的數(shù)據(jù)類型是什么,然后我們?cè)诤蠖耸褂孟鄳?yīng)的解析器去解析數(shù)據(jù)。

Django中的數(shù)據(jù)解析

在視圖中我們可以通過request.POST來獲取前端發(fā)來的請(qǐng)求數(shù)據(jù),那么Django框架是如何拿到請(qǐng)求體中的數(shù)據(jù)的呢?我們一起來看一下:

首先,request對(duì)象是 WSGIRequest 類的實(shí)例化對(duì)象,那我們?nèi)タ匆幌麓a:

此時(shí)我們回想在Django的視圖中通過request.POST和request.FILES能夠取到數(shù)據(jù)都是因?yàn)樵谶@里把請(qǐng)求的數(shù)據(jù)解析,并賦值給request對(duì)象了。

同時(shí)我們還會(huì)發(fā)現(xiàn)一個(gè)問題就是,Django的解析器是不支持 ContenType為 application/json 的,也就是說無法解析json格式的數(shù)據(jù)。

DRF中的解析器

我們都知道在DRF中獲取請(qǐng)求提交的數(shù)據(jù)是通過訪問request.data,那么request.data的數(shù)據(jù)是從哪里來的呢?我們通過源碼來看一下:

如果沒有配置解析器,DRF會(huì)使用默認(rèn)的解析器:

我們可以在單個(gè)視圖或者全局的settings.py中配置要使用的解析器。

單個(gè)視圖配置

class BookViewSet(ModelViewSet):queryset = models.Book.objects.all()serializer_class = BookModelSerializerparser_classes = [JSONParser, ]

全局配置

REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ('rest_framework.parsers.JSONParser',) }

注意:當(dāng)你的項(xiàng)目中只配置了 JSONParser 解析器時(shí),你的項(xiàng)目現(xiàn)在就只能解析JSON格式的數(shù)據(jù)了,客戶端如果使用瀏覽器提交,那么你將無法解析。注意,在視圖類中定義的配置項(xiàng)的優(yōu)先級(jí)要高于全局配置中的配置項(xiàng)。

渲染器

渲染器同解析器相反,它定義了框架按照content_type來返回不同的響應(yīng)。

DRF提供的渲染器有很多,默認(rèn)是

'DEFAULT_RENDERER_CLASSES': ('rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',),

我們也可以在視圖中局部設(shè)置也可以在全局的settings.py中進(jìn)行設(shè)置:

局部設(shè)置

class PublisherViewSet(ModelViewSet):queryset = models.Publisher.objects.all()serializer_class = PublisherModelSerializerrenderer_classes = [JSONRenderer, ]

這樣設(shè)置后就只能返回JSON格式的數(shù)據(jù)了,并不會(huì)像之前一樣提供一個(gè)閱讀友好的web頁面。

全局設(shè)置

REST_FRAMEWORK = {'DEFAULT_RENDERER_CLASSES': ('rest_framework.renderers.JSONRenderer',), }

注意,在視圖類中定義的配置項(xiàng)的優(yōu)先級(jí)要高于全局配置中的配置項(xiàng)。

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Django REST framework 解析器和渲染器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。