日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

django rest framework 小小心得

 印度阿三17 2020-02-28

這篇主要是針對於個人目前學(xué)習(xí)django rest framework的一些小小心得,在開發(fā)django而言,想要撰寫restful api,是有幾個套件可以選擇的

主要而言是這兩個,個人是學(xué)django rest framework,tastypie個人沒啥碰所以就不做啥比較了,當(dāng)然你也可以不屑使用上面這兩個,小弟有看過使用requests來實作api的 :)

大致上這篇會用下列的順序介紹

  • core part
  • serializer
  • generic api
  • url router
  • some situation may bother you

core part

個人覺得這套主要核心整個圍繞在serializer上,其他的有class based views的相關(guān)api,api通常會跟permissionauthentication有所關(guān)聯(lián),最後如果想要用比較generic way的方式,就要用到viewsetrouter。

這邊rest framework的quick start個人覺得做了一個很簡單上手的示範(fàn),讓你先了解一些基本概念,serializer的基本使用方法,如果有看他source code,可以看到他的概念就是從django form,field那些過來的,所以會有很多類似的東西,至於serializer比較深的東西,下一個段落再來多說明。

quick start 後面也提到class based view的使用方式,不過他是從function based view帶到class based view,個人比較偏好class based view,可讀性更好,假如你一個function based view可接受很多http method,這樣裏面code就一定會參雜各種method的相對應(yīng)code,很可能你裏面就會有向下面這樣

1
2
3
4
5
6
7


def (request, *arg, **kwargs):
if request.method == 'GET':
pass
elif request.method == 'POST':
pass

沒有說那種一定好一定壞,就看客官的個人喜好囉~~

再來requestresponse在restframework都有經(jīng)過額外的包裝(包裝django的response和request)這邊比較沒啥要注意的。反而是authenticationpermission比較值得注意,也就是對於API進行一些存取權(quán)限的控管。有個地方需要注意的是

1
2
3
4
5

permission_classes = (permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly,)

authentication_classes = (SessionAuthentication, BasicAuthentication)

permission是裡面所有的permission都過了,這個request才可以執(zhí)行,authentication是只要裏面有一個成功通過,那就可以執(zhí)行了。

不信請看,rest framework源碼片斷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)

# the process for checking authentication
for authenticator in self.authenticators:
try:
user_auth_tuple = authenticator.authenticate(self)
except exceptions.APIException:
self._not_authenticated()
raise

if user_auth_tuple is not None:
self._authenticator = authenticator
self.user, self.auth = user_auth_tuple
return

最後的core part,就是viewset和router了,這部份就在url router那邊再多做說明。

serializer

serizlier跟django的Form使用起來很像,但是這不代表它是繼承於django的form喔,有興趣的看源碼,用serializer的目的,個人是覺得把表單驗證的邏輯(舉凡參數(shù)驗證也可)從api view切開,這樣也不會讓api裏面的程式碼過於複雜。

一般而言大多數(shù)情況應(yīng)該都是使用modelserializer,的確針對於CRUD方面確實方便,但是有時候就是會遇到當(dāng)你create這個model時,會有和model對不上的欄位,進而造成錯誤發(fā)生,或是很難使用,拿個最簡單的例子,創(chuàng)造一個使用者,通常會需要一個email,password,password2,但是使用者model並不會有password2,畢竟那只是確認使用者密碼是不是一致。

對於這種情形,我是另外寫一個serializer專門為創(chuàng)造使用者,而且也不是用ModelSerializer,只是一般的serializer,那記得要define create的method,假如你是要用在generic viewset的create的這地方。

另外使用modelserializer會遇到的一種情況是,今天你想要客製化回傳的資料,比如今天你的user model裏面有一個欄位是mugshot(ImageField),那個一般情況UserSerializer.data,那麼回傳格式通常會是希望是大概如下

1
2
3
4
{
"email": "aa@test.com",
"mugshot": "http:///media/.../" # url 位址
}

但是往往天不從人願,預(yù)設(shè)可不是回傳url位址,像這種情況我目前知道的算比較OK的解法有兩種

第1種

就是使用SerializerMethodField,基本上就是建立一個readonly的field,使用方法文檔說明了很清楚,這邊我就不多說明~~

第2種

就是overwride serializer的to_representationmethod,這個我是看源碼去理解出來的邪門歪道? 不過這邊也只是跟你講講也可以用這樣的方法 :p

再來就是文檔的地方也有說,使用serializer時,帶入partial這個參數(shù)是可以直接partiali update或是其他的東東,這是一個不錯用的東西~~

1
serializer = CommentSerializer(comment, data={'content': u'foo bar'}, partial=True)

最後其實剛剛上述的對於creation的用途另外寫一個專用的serializer,你也可以不要這樣寫,就全都寫在同樣的serializer上,用上面的userserializer繼續(xù)舉例:

1
2
3
4
5
6
7
8
9

大專欄
來源:https://www./content-4-643301.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約