[Django REST FrameWork][7]:模式和客戶端庫

模式是一種機器可讀文檔婆廊,用于描述可用的API端點碌冶,其URLS以及它們支持的操作朱盐。

模式可以是自動生成的文檔的有用工具购桑,也可以用于驅(qū)動可以與API進(jìn)行交互的動態(tài)客戶端庫畅铭。

核心API

為了提供模式支持REST框架使用Core API

Core API是用于描述API的文檔規(guī)范勃蜘。它用于提供可用端點的內(nèi)部表示格式以及API暴露的可能交互硕噩。它可以用于服務(wù)器端或客戶端。

當(dāng)使用服務(wù)器端時缭贡,Core API允許API支持各種模式或超媒體格式的渲染炉擅。

當(dāng)客戶端使用時,Core API允許動態(tài)驅(qū)動的客戶端庫可以與暴露支持的模式或超媒體格式的任何API進(jìn)行交互阳惹。

添加模式

REST框架支持明確定義的模式視圖或自動生成的模式坑资。由于我們使用的是視圖和路由器,我們可以簡單地使用自動模式生成穆端。

您需要安裝coreapipython包才能包含API模式袱贮。

$?pip?install?coreapi

現(xiàn)在我們可以通過在URL配置中包含一個自動生成的模式視圖來為API添加模式。

from?rest_framework.schemas?import?get_schema_view

schema_view?=?get_schema_view(title='Pastebin?API')

urlpatterns?=?[

????url(r'^schema/$',?schema_view),

????...

]

如果您在瀏覽器中訪問API根端點体啰,則現(xiàn)在應(yīng)該可以看到corejson?表示形式作為選項可用攒巍。

我們還可以通過在Accept標(biāo)題中指定所需的內(nèi)容類型從命令行請求模式。

$?http?http://127.0.0.1:8000/schema/?Accept:application/coreapi+json

HTTP/1.0?200?OK

Allow:?GET,?HEAD,?OPTIONS

Content-Type:?application/coreapi+json

{

????"_meta":?{

????????"title":?"Pastebin?API"

????},

????"_type":?"document",

????...

默認(rèn)輸出樣式是使用Core JSON編碼荒勇。

還支持其他架構(gòu)格式柒莉,如Open API(以前稱為Swagger)。

使用命令行客戶端

現(xiàn)在我們的API暴露了架構(gòu)端點沽翔,我們可以使用動態(tài)客戶端庫來與API進(jìn)行交互兢孝。為了證明這一點,我們來使用Core API命令行客戶端仅偎。

命令行客戶端可用作coreapi-cli包:

$?pip?install?coreapi-cli

現(xiàn)在檢查它在命令行上可用...

$?coreapi

Usage:?coreapi?[OPTIONS]?COMMAND?[ARGS]...

??Command?line?client?for?interacting?with?CoreAPI?services.

??Visit?http://www.coreapi.org?for?more?information.

Options:

??--version??Display?the?package?version?number.

??--help?????Show?this?message?and?exit.

Commands:

...

首先跨蟹,我們將使用命令行客戶機加載API模式。

$?coreapi?get?http://127.0.0.1:8000/schema/

????snippets:?{

????????highlight(id)

????????list()

????????read(id)

????}

????users:?{

????????list()

????????read(id)

????}

我們還沒有認(rèn)證橘沥,所以現(xiàn)在我們只能看到只讀端點窗轩,這與我們?nèi)绾卧O(shè)置API的權(quán)限一致。

我們嘗試列出現(xiàn)有的片段座咆,使用命令行客戶端:

$?coreapi?action?snippets?list

[

????{

????????"url":?"http://127.0.0.1:8000/snippets/1/",

????????"id":?1,

????????"highlight":?"http://127.0.0.1:8000/snippets/1/highlight/",

????????"owner":?"lucy",

????????"title":?"Example",

????????"code":?"print('hello,?world!')",

????????"linenos":?true,

????????"language":?"python",

????????"style":?"friendly"

????},

????...

一些API端點需要命名參數(shù)痢艺。例如,要獲取特定代碼段的高亮度HTML介陶,我們需要提供一個id堤舒。

$?coreapi?action?snippets?highlight?--param?id=1

??Example

??...

認(rèn)證我們的客戶

如果我們想要創(chuàng)建,編輯和刪除片段哺呜,我們需要作為有效用戶進(jìn)行身份驗證舌缤。在這種情況下,我們只需使用基本的auth。

確保更換友驮,并與您的實際用戶名和密碼下面漂羊。

$?coreapi?credentials?add?127.0.0.1?:?--auth?basic

Added?credentials

127.0.0.1?"Basic?<...>"

現(xiàn)在驾锰,如果我們再次獲取架構(gòu)卸留,我們應(yīng)該能夠看到一整套可用的交互。

$?coreapi?reload

Pastebin?API?"http://127.0.0.1:8000/schema/">

????snippets:?{

????????create(code,?[title],?[linenos],?[language],?[style])

????????delete(id)

????????highlight(id)

????????list()

????????partial_update(id,?[title],?[code],?[linenos],?[language],?[style])

????????read(id)

????????update(id,?code,?[title],?[linenos],?[language],?[style])

????}

????users:?{

????????list()

????????read(id)

????}

我們現(xiàn)在可以與這些端點進(jìn)行交互椭豫。例如耻瑟,要創(chuàng)建新的代碼段:

$?coreapi?action?snippets?create?--param?title="Example"?--param?code="print('hello,?world')"

{

????"url":?"http://127.0.0.1:8000/snippets/7/",

????"id":?7,

????"highlight":?"http://127.0.0.1:8000/snippets/7/highlight/",

????"owner":?"lucy",

????"title":?"Example",

????"code":?"print('hello,?world')",

????"linenos":?false,

????"language":?"python",

????"style":?"friendly"

}

并刪除片段:

$?coreapi?action?snippets?delete?--param?id=7

除了命令行客戶端,開發(fā)人員還可以使用客戶端庫與您的API進(jìn)行交互赏酥。Python客戶端庫是第一個可用的喳整,并且計劃很快發(fā)布一個Javascript客戶端庫。

有關(guān)定制模式生成和使用Core API客戶端庫的更多詳細(xì)信息裸扶,您需要參考完整的文檔框都。

回顧我們的工作

我們擁有非常少量的代碼,現(xiàn)在擁有一個完整的可以瀏覽網(wǎng)頁的完整的pastebin Web API呵晨,它包含一個模式驅(qū)動的客戶端庫魏保,并且具有身份驗證,每個對象權(quán)限和多個渲染器格式摸屠。

我們已經(jīng)走過了設(shè)計過程的每一步谓罗,并且看到了如何自定義任何我們可以逐漸工作的方式來簡單地使用常規(guī)的Django視圖。

您可以查看GitHub上的最終教程代碼季二,或者嘗試沙盒中的實例檩咱。

向上和向上

我們已經(jīng)完成了我們的教程。如果您想要更多地參與到REST框架項目中胯舷,以下是您可以開始的幾個地方:

通過審查和提交問題刻蚯,提出請求,為GitHub做出貢獻(xiàn)桑嘶。

加入REST框架討論組芦倒,并幫助構(gòu)建社區(qū)。

跟隨Twitter上的作者不翩,并說你好兵扬。

現(xiàn)在去構(gòu)建真棒的東西。

Django REST FrameWork中文文檔目錄:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末口蝠,一起剝皮案震驚了整個濱河市器钟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妙蔗,老刑警劉巖傲霸,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡昙啄,警方通過查閱死者的電腦和手機穆役,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梳凛,“玉大人耿币,你說我怎么就攤上這事∪途埽” “怎么了淹接?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叛溢。 經(jīng)常有香客問我塑悼,道長,這世上最難降的妖魔是什么楷掉? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任厢蒜,我火速辦了婚禮,結(jié)果婚禮上烹植,老公的妹妹穿的比我還像新娘斑鸦。我一直安慰自己,他們只是感情好刊橘,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布鄙才。 她就那樣靜靜地躺著,像睡著了一般促绵。 火紅的嫁衣襯著肌膚如雪攒庵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天败晴,我揣著相機與錄音浓冒,去河邊找鬼。 笑死尖坤,一個胖子當(dāng)著我的面吹牛稳懒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慢味,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼场梆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纯路?” 一聲冷哼從身側(cè)響起或油,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驰唬,沒想到半個月后顶岸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腔彰,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年辖佣,在試婚紗的時候發(fā)現(xiàn)自己被綠了霹抛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡卷谈,死狀恐怖杯拐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雏搂,我是刑警寧澤藕施,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布寇损,位于F島的核電站凸郑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏矛市。R本人自食惡果不足惜芙沥,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浊吏。 院中可真熱鬧而昨,春花似錦、人聲如沸找田。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墩衙。三九已至务嫡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漆改,已是汗流浹背心铃。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挫剑,地道東北人去扣。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像樊破,于是被迫代替她去往敵國和親愉棱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容