python Flask實現(xiàn)restful api service
一直在用node.js做后端,要逐步涉獵大數(shù)據(jù)范圍,注定繞不過python,因此決定把一些成熟的東西用python來重寫,一是開拓思路、通過比較來深入學(xué)習(xí)python;二是有目標(biāo),有動力,希望能持之以恒的堅持下去。
項目介紹
用python語言來寫一個restful api service,數(shù)據(jù)庫使用mysql。因為只做后端微服務(wù),并且ORM的實現(xiàn)方式,采用自動生成SQL的方式來完成,因此選擇了輕量級的flask作為web框架。如此選擇,主要目的是針對中小規(guī)模的網(wǎng)絡(luò)應(yīng)用,能充分利用關(guān)系數(shù)據(jù)庫的種種優(yōu)勢,來實現(xiàn)豐富的現(xiàn)代互聯(lián)網(wǎng)應(yīng)用。
REST的六個特性:
- Client-Server:服務(wù)器端與客戶端分離。
- Stateless(無狀態(tài)):每次客戶端請求必需包含完整的信息,換句話說,每一次請求都是獨立的。
- Cacheable(可緩存):服務(wù)器端必需指定哪些請求是可以緩存的。
- Layered System(分層結(jié)構(gòu)):服務(wù)器端與客戶端通訊必需標(biāo)準(zhǔn)化,服務(wù)器的變更并不會影響客戶端。
- Uniform Interface(統(tǒng)一接口):客戶端與服務(wù)器端的通訊方法必需是統(tǒng)一的。
- Code on demand(按需執(zhí)行代碼?):服務(wù)器端可以在上下文中執(zhí)行代碼或者腳本
restful api
restful api 的概念就不介紹了。這里說一下我們實現(xiàn)協(xié)議形式:
[GET]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen [POST]/rs/user[/{id}] [PUT]/rs/user/{id} [DELETE]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen
說明:
- rs為資源標(biāo)識;
- 第二節(jié),user,會被解析為數(shù)據(jù)庫表名;
- 查詢時,id為空或0時,id會被忽略,即為列表查詢;
- 新建和修改,除接收form表單外,url中的id參數(shù)也會被合并到參數(shù)集合中;
- 刪除同查詢。
讓flask支持正則表達(dá)式
flask默認(rèn)路由不支持正則表達(dá)式,而我需要截取完整的URL自己來解析,經(jīng)查詢,按以下步驟很容易完成任務(wù)。
- 使用werkzeug庫 :from werkzeug.routing import BaseConverter
- 定義轉(zhuǎn)換器:
class RegexConverter(BaseConverter): def __init__(self, map, *args): self.map = map self.regex = args[0]
- 注冊轉(zhuǎn)換器 : app.url_map.converters['regex'] = RegexConverter
- 用正則來截取url : @app.route('/rs/<regex(".*"):query_url>', methods=['PUT', 'DELETE', 'POST', 'GET'])
幾點疑問:
- 正則(.*)理論上應(yīng)該是匹配任何除回車的所有字符,但不知道為什么,在這里不識別問號(?)
- 我用request.data來取表單數(shù)據(jù),為何request.form取不到?
- '/rs/<regex("."):query_url>'后若加個反斜杠('/rs/<regex("."):query_url>/'),request.data就取不到數(shù)據(jù),為什么?
解析json數(shù)據(jù)
解析json數(shù)據(jù)很容易,但我需要對客戶端送上來的數(shù)據(jù)進(jìn)行校驗,下面是用異常處理又只解析一次的解決方案。
def check_json_format(raw_msg): try: js = json.loads(raw_msg, encoding='utf-8') except ValueError: return False, {} return True, js
URL解析
按既定協(xié)議解析URL,提取表名,為生成sql組合參數(shù)集合。
@app.route('/rs/<regex(".*"):query_url>', methods=['PUT', 'DELETE', 'POST', 'GET']) def rs(query_url): (flag, params) = check_json_format(request.data) urls = query_url.split('/') url_len = len(urls) if url_len < 1 or url_len > 2 and url_len % 2 == 1: return "The params is wrong." ps = {} for i, al in enumerate(urls): if i == 0: table = al elif i == 1: idd = al elif i > 1 and i % 2 == 0: tmp = al else: ps[tmp] = al ps['table'] = table if url_len > 1: ps['id'] = idd if request.method == 'POST' or request.method == 'PUT': params = dict(params, **{'table': ps.get('table'), 'id': ps.get('id')}) if request.method == 'GET' or request.method == 'DELETE': params = ps return jsonify(params)
完整代碼
git clone https://github.com/zhoutk/pyrest.git cd rest export FLASK_APP=index.py flask run
小結(jié)
今天利用flask完成了web基礎(chǔ)架構(gòu),能夠正確解析URL,提取客戶端提交的數(shù)據(jù),按請求的不同方式來組合我們需要的數(shù)據(jù)。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python模塊restful使用方法實例
- Python利用Django如何寫restful api接口詳解
- 在Python的框架中為MySQL實現(xiàn)restful接口的教程
- Python restful框架接口開發(fā)實現(xiàn)
- Python實現(xiàn)Restful API的例子
- Python中Flask-RESTful編寫API接口(小白入門)
- 使用Python & Flask 實現(xiàn)RESTful Web API的實例
- Python進(jìn)行Restful?API開發(fā)實例詳解
- python用post訪問restful服務(wù)接口的方法
- 探索?Python?Restful?接口測試的奧秘
相關(guān)文章
Python的pywifi無線網(wǎng)絡(luò)庫的具體使用
pywifi是一個基于Python的用于操作無線網(wǎng)絡(luò)的庫,本文就來介紹一下pywifi的安裝及實際應(yīng)用場景使用,具有一定的參考價值,感興趣的可以了解一下2024-02-02將python圖片轉(zhuǎn)為二進(jìn)制文本的實例
今天小編就為大家分享一篇將python圖片轉(zhuǎn)為二進(jìn)制文本的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01詳解Pytorch如何利用yaml定義卷積網(wǎng)絡(luò)
大多數(shù)卷積神經(jīng)網(wǎng)絡(luò)都是直接通過寫一個Model類來定義的,這樣寫的代碼其實是比較好懂,也很方便。但是本文將介紹另一個方法:利用yaml定義卷積網(wǎng)絡(luò),感興趣的可以了解一下2022-10-10基于Python實現(xiàn)GeoServer矢量文件批量發(fā)布
由于矢量圖層文件較多,手動發(fā)布費時費力,python支持的關(guān)于geoserver包又由于年久失修,無法在較新的geoserver版本中正常使用。本文為大家準(zhǔn)備了Python自動化發(fā)布矢量文件的代碼,需要的可以參考一下2022-07-07python GUI庫圖形界面開發(fā)之PyQt5中QWebEngineView內(nèi)嵌網(wǎng)頁與Python的數(shù)據(jù)交互傳參詳細(xì)方法
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt中QWebEngineView內(nèi)嵌網(wǎng)頁與Python的數(shù)據(jù)交互詳細(xì)方法實例,需要的朋友可以參考下2020-02-02Python實現(xiàn)列表轉(zhuǎn)換成字典數(shù)據(jù)結(jié)構(gòu)的方法
這篇文章主要介紹了Python實現(xiàn)列表轉(zhuǎn)換成字典數(shù)據(jù)結(jié)構(gòu)的方法,結(jié)合實例形式分析了Python數(shù)值類型轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2016-03-03