當前位置:
首頁 > 最新 > Flask RESTful API 開發-基礎篇

Flask RESTful API 開發-基礎篇

0. 前言

接下來一段時間,Gevin將開一個系列專題,講Flask RESTful API的開發,本文是第1篇《Flask RESTful 基礎》,本系列文章列表如下:

基礎篇(1) --- Flask RESTful 基礎

To Be Continued...

1. RESTful 簡介

我在博文《RESTful 架構風格概述》和《RESTful API 編寫指南》中曾詳細論述過我對RESTful的理解,以及規範的RESTful API開發需要涉及的內容,本節摘錄幾條重點內容,為下文做鋪墊:

RESTful 是面向資源的,每個資源至少有一個url與之對應

統一數據交互介面,即通過http的 , , (or ), 和 進行資源的獲取、創建、更新和刪除

資源(數據)以文本形式在網路上傳輸,通常以json或xml格式為載體

無狀態(以後講認證時再展開論述)

2. Flask 對RESTful 架構風格的支持

Flask RESTful 開發相關的庫很多,我也收集過一些(collection在此,不定期更新),其實,與Django不同,Flask原生對RESTful的支持已經做的很好,不藉助這些extension,一樣可以開發出足夠好的RESTful API,而且沒有這些extension的束縛,我們可以在開發過程中,配合使用Flask生態中處理相應問題最好的extension,或者我們自己最上手的extension,這也更加符合Flask的philosophy。Gevin在Flask RESTful 開發中,不使用各類flask rest擴展的主要原因,正是每個擴展都有不盡如意之處。

那麼,我們就來看一下Flask原生是如何支持RESTful開發的。

2.1 Flask對HTTP方法的支持

Flask原生支持所有的HTTP方法,如RESTful API中最常用的 , , , 和 ,這些不需贅述解釋,直接上代碼即可:

@app.route( /http-method-test/ , methods=[ GET , POST , PUT , PATCH , DELETE ]) def http_method_example(): if request.method == GET : return Send request with `GET` method elif request.method == POST : return Send request with `POST` method elif request.method == PUT : return Send request with `PUT` method elif request.method == PATCH : return Send request with `PATCH` method elif request.method == DELETE : return Send request with `DELETE` method

另外一種方式是採用Flask的 :

class HttpMethodExample(MethodView): def get(self): return Send request with `GET` method def post(self): return Send request with `POST` method def put(self): return Send request with `PUT` method def patch(self): return Send request with `PATCH` method def delete(self): return Send request with `DELETE` method app.add_url_rule( /http-method-test2/ , view_func=HttpMethodExample.as_view( http_method_example2 ))2.2 Flask 對序列化與反序列化的支持

RESTful 開發時,數據的載體通常為 或 格式的文本,隨著RESTful的不斷發展, 更是成為了RESTful API 數據的主流載體。而Flask本身,已經對json的支持已經非常好了。

2.2.1 序列化

RESTful API開發中的序列化,通過包含了以下操作:

將Python native格式的數據(如dict和list)轉換為文本數據(如json或xml)

將文本數據作為請求的response返回給客戶端,response的http header里要同時附加 這個mimetype

這兩步操作,Flask提供的一個快捷函數 能直接完成,其詳情正如下面的Flask官方文檔所述:

This function wraps dumps() to add a few enhancements that make life easier. It turns the JSON output into a Response object with the application/json mimetype. For convenience, it also converts multiple arguments into an array or multiple keyword arguments into a dict. This means that both jsonify(1,2,3) and jsonify([1,2,3]) serialize to [1,2,3].

很簡單的事情,不該說這麼多,直接上代碼示例吧:

class SerializationExample(MethodView): def get(self): option = request.args.get( option ) if option == list1 : return self.test_list() if option == list2 : return self.test_list2() if option == dict1 : return self.test_dict1() if option == dict2 : return self.test_dict2() if option == dict3 : return self.test_dict3() msg = { info : `option` is needed in url as a url parameter , avilable option values : list1, list2, test_dict1, test_dict2, test_dict2 } return jsonify(msg) def test_list(self): data = [{ a :1, b :2}, { c :3, d :4}] return jsonify(result=data) def test_list2(self): data = [1,2,3,4,5,6,7,8] return jsonify(data) def test_dict1(self): data = { a :1, b :2, c :3} return jsonify(data) def test_dict2(self): data = { a :1, b :2, c :3} return jsonify(**data) def test_dict3(self): data = { a :1, b :2, c :3} return jsonify(result=data) app.add_url_rule( /serialization/ , view_func=SerializationExample.as_view( serialization ))

上面代碼的重點即,那幾個以 開頭的函數,序列化的表現形式無外乎這幾種。

2.2.2 反序列化

反序列化,即把文本形式的數據轉換為Python native類型數據的過程。在RESTful API開發時,Flask內置的 方法,能夠把request中的json數據,轉換為Python標準庫中的dict或list。

Parses the incoming JSON request data and returns it. By default this function will return None if the mimetype is not , but this can be overridden by the force parameter.

If parsing fails the method on the request object will be invoked.

示例代碼:

@app.route( /deserialization/ , methods=[ get , post ]) def deserialization(): if request.method == POST : data = request.get_json() if not data: return No json data found , 400 result = { json data in request : data } return jsonify(result) return Please post json data 註:

Flask原生的序列化和反序列化方法,都是針對目前RESTful API 開發時最流行的json格式的,且只能做 與 或 的相互轉換,如果想序列化或反序列化對象實例,需要藉助其他方法,這個會在以後的文章中做進一步解釋。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

NSA武器庫之eternalchampion復現
擬介科技:為什麼醫生做手術戴上 AR 眼鏡就像有了透視眼一樣?
Rust 妙用:增補標準庫和統一錯誤
那個一站到底中的汪仔機器人,來眾測了?人機大戰誰會獲勝?
如何使用谷歌Chrome瀏覽器竊取Windows密碼

TAG:推酷 |

您可能感興趣

ESP32 開發板正式通過 Amazon FreeRTOS 的驗證
《Pokemon Go》開發商收購AR API製作公司EscherReality
NI FlexRIO 使用Kintex UltraScale FPGA和夾層I/O模塊,滿足客戶定製前端開發
Discuz API JSON 適用於IOS及Android移動端開發
初探Burp Suite API 開發
NET Core開發日誌——WCF Client
WayRay舉辦「True SDK Challenge」大賽,重金招募AR開發者
「假大空」的 Watson:IEEE Spectrum揭秘IBM混亂AI開發現狀
2.2 VR掃描:《Pokemon?Go》開發商收購AR公司Escher?Reality;微軟或將收購EA、Valve或PUBG
Square Enix正開發新動作RPG:登陸PS4及Switch
RED正在開發基於Facebook Surround360技術的VR相機
Realtek藉助Cadence Innovus成功開發DTV SoC解決方案
Atlus的新遊戲《PROJECT Re FANTASY》看起來開發很順利
Facebook Reality Labs正式成立面向VR/AR開發
《Pokemon Go》開發商收購AR公司Escher Reality
美高森美和SiFive推出HiFive Unleashed擴展板助力Linux軟體和固件開發人員首次構建RISC-V PC
Science:開發出基於CRISPR-Cas12a的技術檢測病毒DNA
Cadence Innovus助力Realtek成功開發DTV SoC解決方案
Pokémon GO開發商將收購AR公司Escher
開發者公布UEFI:可讓Lumia設備裝Win 10 on ARM