CVB:基于類(lèi)的視圖函數(shù),resful規(guī)范,序列化-創(chuàng)新互聯(lián)

-Class Base View(基于類(lèi)的視圖)
-Function Base View(基于函數(shù)的視圖)
-def as_view 類(lèi)方法
-def view:類(lèi)方法內(nèi)部,閉包函數(shù)定義:內(nèi)層函數(shù)包含對(duì)外部作用域的引用
-python中一切皆對(duì)象:函數(shù)也是對(duì)象
-hasattr(self, 'get')--判斷self類(lèi)中是不是有該(get)方法  
-反射 setattr(self,get,get_all):相當(dāng)于把get函數(shù),變成了get_all 
-getattr(self, 'get'):拿到get函數(shù)的內(nèi)存地址
- def view(request, *args, **kwargs):
    self = cls(**initkwargs)
    if hasattr(self, 'get') and not hasattr(self, 'head'):
        self.head = self.get
    self.request = request
    self.args = args
    self.kwargs = kwargs
    #執(zhí)行:dispatch:誰(shuí)的dispatch方法?寫(xiě)的cbv的那個(gè)c,視圖中的那個(gè)視圖類(lèi)
    #我這個(gè)類(lèi)如果沒(méi)有寫(xiě)dispatch,會(huì)執(zhí)行View中的dispatch方法
    return self.dispatch(request, *args, **kwargs)
-def dispatch(self, request, *args, **kwargs):
    #request.method 前臺(tái)請(qǐng)求的方法,轉(zhuǎn)成了小寫(xiě)
    #http_method_names View中定義的一個(gè)列表:是一堆請(qǐng)求方式
    if request.method.lower() in self.http_method_names:
        #getattr的第三個(gè)參數(shù)是默認(rèn)值:self.http_method_not_allowed
        #拿到get方法的內(nèi)存地址
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    #get(request,*args, **kwargs)
    return handler(request, *args, **kwargs)

-總結(jié):
-路由配置好,項(xiàng)目啟動(dòng):as_view()---->返回結(jié)果是一個(gè)class View(object)內(nèi)view函數(shù)的內(nèi)存地址
-請(qǐng)求來(lái)了---->觸發(fā)view函數(shù)的執(zhí)行,就會(huì)執(zhí)行dispatch方法---->根據(jù)請(qǐng)求的不同,分發(fā)到不同的視圖函數(shù)執(zhí)行,最終返回的是HttpResponse

創(chuàng)新互聯(lián)建站為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)app軟件開(kāi)發(fā)、重慶小程序開(kāi)發(fā)公司、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷(xiāo)能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門(mén)都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。 

1.1 閱讀源碼:
左側(cè)工程欄--->設(shè)置圖標(biāo)-->點(diǎn)擊--->show members(能看到py文件,類(lèi)的方法)

2 resful規(guī)范(是什么)
-什么是resful(定義)
-是一個(gè)規(guī)范
-面向資源編程:把網(wǎng)絡(luò)中所有東西,想象成資源
-規(guī)范:
-10條規(guī)范
-API與用戶的通信協(xié)議,總是使用HTTPs協(xié)議:https比http安全
-域名
https://api.example.com 盡量將API部署在專(zhuān)用域名(會(huì)存在跨域問(wèn)題)
https://example.org/api/ API很簡(jiǎn)單
例如寫(xiě)一個(gè)查詢(xún)所有圖書(shū)的api接口:https://api.example.com/books
https://127.0.0.1/api/books
-版本:每個(gè)接口都應(yīng)該有版本
URL,如:https://api.example.com/v1/ https://127.0.0.1/api/v2/books(推薦用這種)
請(qǐng)求頭 跨域時(shí),引發(fā)發(fā)送多次請(qǐng)求
-路徑,視網(wǎng)絡(luò)上任何東西都是資源,均使用名詞表示(可復(fù)數(shù))
https://api.example.com/v1/books
https://api.example.com/v1/animals
https://api.example.com/v1/employees
不能這么寫(xiě):
-獲取所有圖書(shū):https://127.0.0.1/api/get_all_books
-新增一本書(shū):https://127.0.0.1/api/add_book
同一都用這個(gè):
https://api.example.com/v1/books
-method
GET :從服務(wù)器取出資源(一項(xiàng)或多項(xiàng))
POST :在服務(wù)器新建一個(gè)資源
PUT :在服務(wù)器更新資源(客戶端提供改變后的完整資源)
PATCH :在服務(wù)器更新資源(客戶端提供改變的屬性)
DELETE :從服務(wù)器刪除資源
-過(guò)濾,通過(guò)在url上傳參的形式傳遞搜索條件
https://api.example.com/v1/zoos?limit=10:指定返回記錄的數(shù)量
-狀態(tài)碼
請(qǐng)求回去,需要有狀態(tài)碼
自定義狀態(tài)碼
status: 100表示成功
101表示用戶名密碼錯(cuò)誤
102我也不知道什么錯(cuò)誤
-錯(cuò)誤處理,應(yīng)返回錯(cuò)誤信息,error當(dāng)做key。
-{status:100,error:'錯(cuò)誤信息寫(xiě)上'}
-返回結(jié)果,針對(duì)不同操作,服務(wù)器向用戶返回的結(jié)果應(yīng)該符合以下規(guī)范。
GET /books:返回資源對(duì)象的列表(數(shù)組)
GET /books/1:返回單個(gè)資源對(duì)象
POST /books:返回新生成的資源對(duì)象 -新增,傳數(shù)據(jù),一旦新增完成,把新的資源對(duì)象返回
PUT /books/1:返回完整的資源對(duì)象
PATCH /books/1:返回完整的資源對(duì)象
DELETE /books/1:返回一個(gè)空文檔
-Hypermedia API,RESTful API最好做到Hypermedia,即返回結(jié)果中提供鏈接,連向其他API 方法,使得用戶不查文檔,也知道下一步應(yīng)該做什么。
{
status:100
msg:成功
url:127.0.0.1/books/1
}
核心:返回結(jié)果中提供鏈接

2.1 django寫(xiě)resful規(guī)范的接口
2.2 postman軟件:模擬發(fā)請(qǐng)求的軟件
2.3 格式化json格式數(shù)據(jù)
-https://www.json.cn/
2.4 put請(qǐng)求,django不會(huì)幫我解析body內(nèi)的數(shù)據(jù),需要自己處理

3 drf(django rest framework)框架(django的app)
安裝:djangorestframework
-它是一個(gè)app,要在咱的項(xiàng)目中用
-只是快速的構(gòu)建resful規(guī)范的接口
-csrf_exempt:局部禁用csrf(csrf是可以局部使用,局部禁用)
-以后再執(zhí)行的dispatch方法是APIView的dispatch方法

resful的規(guī)范:****
-10 個(gè)
-1 推薦用https
-2 域名:
-3 版本:
-4 視網(wǎng)絡(luò)上任何東西都是資源,均使用名詞表示
-5 method通過(guò)請(qǐng)求的方式來(lái)表示是新增,獲取,修改,刪除資源
-6 過(guò)濾:(要查價(jià)格大于10的書(shū))127.0.0.1/api/v1/books/?price_gt=10
-7 狀態(tài)碼:
-8 錯(cuò)誤信息
-9 返回結(jié)果,針對(duì)不同操作,服務(wù)器向用戶返回的結(jié)果應(yīng)該符合以下規(guī)范。
-10 返回結(jié)果中提供鏈接

APIView 類(lèi)
    -繼承了View
    -重寫(xiě)了as_view方法,在內(nèi)部屏蔽了csrf
    -重寫(xiě)了dispatch方法---核心

        Request 類(lèi)
    -封裝了原來(lái)的request
    -request.data   --->前臺(tái)傳遞過(guò)來(lái)的數(shù)據(jù),放在里面
    -request重寫(xiě)了__getattr__方法
    -request.query_params   就是原來(lái)request.的GET

-getattr和setattr
-重點(diǎn)掌握這三點(diǎn):
    -request.data 是個(gè)方法,包裝成了屬性,前臺(tái)傳過(guò)來(lái)body體中數(shù)據(jù)的數(shù)據(jù),放在里面
    -request.query_params  這個(gè)是原來(lái)GET中的數(shù)據(jù)
    -request把原來(lái)的request包裝進(jìn)去了

4 APIView源碼分析

5 序列化
-1 自己寫(xiě)for循環(huán)來(lái)處理(麻煩)
-2 django提供的序列化組件(不可控)
from django.core import serializers
ret=serializers.serialize('json','queryset對(duì)象')
ret就是序列化之后的字符串了,不需要再序列化了
-3 drf提供的序列化組件
-1 先導(dǎo)入
from rest_framework.serializers import Serializer
from rest_framework import serializers
-2 寫(xiě)一個(gè)類(lèi),繼承Serializer
-3 在類(lèi)內(nèi)部寫(xiě)屬性:
name=serializers.CharField()
-4 使用:
-先生成對(duì)象,需要傳參數(shù) instance:要序列化的對(duì)象(可能是queryset,也可能是單個(gè)對(duì)象)
many:如果是queryset---True,,如果是單個(gè)對(duì)象--False
-5 對(duì)象.data --->是一個(gè)字典

-1 重命名:用source:xx = serializers.CharField(source='name')
-2 取出出版社名字:
方式一:
-在模型表中重寫(xiě)str方法
-publish=serializers.CharField()
方式二:
-用source
-拿出出版社的城市
-publish=serializers.CharField(source='publish.city')

*****如果不指定source,字段必須對(duì)應(yīng)起來(lái),如果指定了source,字段可以任意命名
        -source 可以指定字段,也可也指定方法
            publish.test這是個(gè)方法,會(huì)執(zhí)行該方法,并拿到返回結(jié)果
            test = serializers.CharField(source='publish.test')
        -3 SerializerMethodField,可以指定一個(gè)方法
            publish=serializers.SerializerMethodField()

# 方法名:叫g(shù)et_字段名,要傳參數(shù),參數(shù)是:當(dāng)前book對(duì)象
def get_publish(self,obj):

obj 是當(dāng)前book對(duì)象

dic={'name':obj.publish.name,'email':obj.publish.email}
                return dic
            -方法內(nèi)部可以繼續(xù)用其他的序列化類(lèi)
    -ModelSerializer
        -必須在類(lèi)中寫(xiě)
        class Meta:
            model=指定表
    **      # fields = 'all'**
            # 指定只取這兩個(gè)字段
            fields = ['nid','name']

** # 去掉指定的字段

exclude=['publish','authors']**

**      # fields,跟exclude不能連用
            # 指定深度,就是跨幾個(gè)表(官方建議小于10,我給你的建議小于3)
            # depth = 2**

創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。

文章名稱(chēng):CVB:基于類(lèi)的視圖函數(shù),resful規(guī)范,序列化-創(chuàng)新互聯(lián)
文章分享:http://muchs.cn/article2/djgdoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站導(dǎo)航、網(wǎng)站營(yíng)銷(xiāo)軟件開(kāi)發(fā)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)