-Class Base View(基于類的視圖)
-Function Base View(基于函數(shù)的視圖)
-def as_view 類方法
-def view:類方法內部,閉包函數(shù)定義:內層函數(shù)包含對外部作用域的引用
-python中一切皆對象:函數(shù)也是對象
-hasattr(self, 'get')--判斷self類中是不是有該(get)方法
-反射 setattr(self,get,get_all):相當于把get函數(shù),變成了get_all
-getattr(self, 'get'):拿到get函數(shù)的內存地址
- 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:誰的dispatch方法?寫的cbv的那個c,視圖中的那個視圖類
#我這個類如果沒有寫dispatch,會執(zhí)行View中的dispatch方法
return self.dispatch(request, *args, **kwargs)
-def dispatch(self, request, *args, **kwargs):
#request.method 前臺請求的方法,轉成了小寫
#http_method_names View中定義的一個列表:是一堆請求方式
if request.method.lower() in self.http_method_names:
#getattr的第三個參數(shù)是默認值:self.http_method_not_allowed
#拿到get方法的內存地址
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)
-總結:
-路由配置好,項目啟動:as_view()---->返回結果是一個class View(object)內view函數(shù)的內存地址
-請求來了---->觸發(fā)view函數(shù)的執(zhí)行,就會執(zhí)行dispatch方法---->根據請求的不同,分發(fā)到不同的視圖函數(shù)執(zhí)行,最終返回的是HttpResponse
1.1 閱讀源碼:
左側工程欄--->設置圖標-->點擊--->show members(能看到py文件,類的方法)
2 resful規(guī)范(是什么)
-什么是resful(定義)
-是一個規(guī)范
-面向資源編程:把網絡中所有東西,想象成資源
-規(guī)范:
-10條規(guī)范
-API與用戶的通信協(xié)議,總是使用HTTPs協(xié)議:https比http安全
-域名
https://api.example.com 盡量將API部署在專用域名(會存在跨域問題)
https://example.org/api/ API很簡單
例如寫一個查詢所有圖書的api接口:https://api.example.com/books
https://127.0.0.1/api/books
-版本:每個接口都應該有版本
URL,如:https://api.example.com/v1/ https://127.0.0.1/api/v2/books(推薦用這種)
請求頭 跨域時,引發(fā)發(fā)送多次請求
-路徑,視網絡上任何東西都是資源,均使用名詞表示(可復數(shù))
https://api.example.com/v1/books
https://api.example.com/v1/animals
https://api.example.com/v1/employees
不能這么寫:
-獲取所有圖書:https://127.0.0.1/api/get_all_books
-新增一本書:https://127.0.0.1/api/add_book
同一都用這個:
https://api.example.com/v1/books
-method
GET :從服務器取出資源(一項或多項)
POST :在服務器新建一個資源
PUT :在服務器更新資源(客戶端提供改變后的完整資源)
PATCH :在服務器更新資源(客戶端提供改變的屬性)
DELETE :從服務器刪除資源
-過濾,通過在url上傳參的形式傳遞搜索條件
https://api.example.com/v1/zoos?limit=10:指定返回記錄的數(shù)量
-狀態(tài)碼
請求回去,需要有狀態(tài)碼
自定義狀態(tài)碼
status: 100表示成功
101表示用戶名密碼錯誤
102我也不知道什么錯誤
-錯誤處理,應返回錯誤信息,error當做key。
-{status:100,error:'錯誤信息寫上'}
-返回結果,針對不同操作,服務器向用戶返回的結果應該符合以下規(guī)范。
GET /books:返回資源對象的列表(數(shù)組)
GET /books/1:返回單個資源對象
POST /books:返回新生成的資源對象 -新增,傳數(shù)據,一旦新增完成,把新的資源對象返回
PUT /books/1:返回完整的資源對象
PATCH /books/1:返回完整的資源對象
DELETE /books/1:返回一個空文檔
-Hypermedia API,RESTful API最好做到Hypermedia,即返回結果中提供鏈接,連向其他API 方法,使得用戶不查文檔,也知道下一步應該做什么。
{
status:100
msg:成功
url:127.0.0.1/books/1
}
核心:返回結果中提供鏈接
2.1 django寫resful規(guī)范的接口
2.2 postman軟件:模擬發(fā)請求的軟件
2.3 格式化json格式數(shù)據
-https://www.json.cn/
2.4 put請求,django不會幫我解析body內的數(shù)據,需要自己處理
3 drf(django rest framework)框架(django的app)
安裝:djangorestframework
-它是一個app,要在咱的項目中用
-只是快速的構建resful規(guī)范的接口
-csrf_exempt:局部禁用csrf(csrf是可以局部使用,局部禁用)
-以后再執(zhí)行的dispatch方法是APIView的dispatch方法
resful的規(guī)范:****
-10 個
-1 推薦用https
-2 域名:
-3 版本:
-4 視網絡上任何東西都是資源,均使用名詞表示
-5 method通過請求的方式來表示是新增,獲取,修改,刪除資源
-6 過濾:(要查價格大于10的書)127.0.0.1/api/v1/books/?price_gt=10
-7 狀態(tài)碼:
-8 錯誤信息
-9 返回結果,針對不同操作,服務器向用戶返回的結果應該符合以下規(guī)范。
-10 返回結果中提供鏈接
APIView 類
-繼承了View
-重寫了as_view方法,在內部屏蔽了csrf
-重寫了dispatch方法---核心
Request 類
-封裝了原來的request
-request.data --->前臺傳遞過來的數(shù)據,放在里面
-request重寫了__getattr__方法
-request.query_params 就是原來request.的GET
-getattr和setattr
-重點掌握這三點:
-request.data 是個方法,包裝成了屬性,前臺傳過來body體中數(shù)據的數(shù)據,放在里面
-request.query_params 這個是原來GET中的數(shù)據
-request把原來的request包裝進去了
4 APIView源碼分析
5 序列化
-1 自己寫for循環(huán)來處理(麻煩)
-2 django提供的序列化組件(不可控)
from django.core import serializers
ret=serializers.serialize('json','queryset對象')
ret就是序列化之后的字符串了,不需要再序列化了
-3 drf提供的序列化組件
-1 先導入
from rest_framework.serializers import Serializer
from rest_framework import serializers
-2 寫一個類,繼承Serializer
-3 在類內部寫屬性:
name=serializers.CharField()
-4 使用:
-先生成對象,需要傳參數(shù) instance:要序列化的對象(可能是queryset,也可能是單個對象)
many:如果是queryset---True,,如果是單個對象--False
-5 對象.data --->是一個字典
-1 重命名:用source:xx = serializers.CharField(source='name')
-2 取出出版社名字:
方式一:
-在模型表中重寫str方法
-publish=serializers.CharField()
方式二:
-用source
-拿出出版社的城市
-publish=serializers.CharField(source='publish.city')
*****如果不指定source,字段必須對應起來,如果指定了source,字段可以任意命名
-source 可以指定字段,也可也指定方法
publish.test這是個方法,會執(zhí)行該方法,并拿到返回結果
test = serializers.CharField(source='publish.test')
-3 SerializerMethodField,可以指定一個方法
publish=serializers.SerializerMethodField()
# 方法名:叫get_字段名,要傳參數(shù),參數(shù)是:當前book對象
def get_publish(self,obj):
dic={'name':obj.publish.name,'email':obj.publish.email}
return dic
-方法內部可以繼續(xù)用其他的序列化類
-ModelSerializer
-必須在類中寫
class Meta:
model=指定表
** # fields = 'all'**
# 指定只取這兩個字段
fields = ['nid','name']
** # 去掉指定的字段
** # fields,跟exclude不能連用
# 指定深度,就是跨幾個表(官方建議小于10,我給你的建議小于3)
# depth = 2**
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。
文章名稱:CVB:基于類的視圖函數(shù),resful規(guī)范,序列化-創(chuàng)新互聯(lián)
文章分享:http://www.rwnh.cn/article2/djgdoc.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網站制作、外貿網站建設、網站導航、網站營銷、軟件開發(fā)、微信小程序
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容