python Flask實(shí)現(xiàn)restful api service
一直在用node.js做后端,要逐步涉獵大數(shù)據(jù)范圍,注定繞不過(guò)python,因此決定把一些成熟的東西用python來(lái)重寫(xiě),一是開(kāi)拓思路、通過(guò)比較來(lái)深入學(xué)習(xí)python;二是有目標(biāo),有動(dòng)力,希望能持之以恒的堅(jiān)持下去。
項(xiàng)目介紹
用python語(yǔ)言來(lái)寫(xiě)一個(gè)restful api service,數(shù)據(jù)庫(kù)使用mysql。因?yàn)橹蛔龊蠖宋⒎?wù),并且ORM的實(shí)現(xiàn)方式,采用自動(dòng)生成SQL的方式來(lái)完成,因此選擇了輕量級(jí)的flask作為web框架。如此選擇,主要目的是針對(duì)中小規(guī)模的網(wǎng)絡(luò)應(yīng)用,能充分利用關(guān)系數(shù)據(jù)庫(kù)的種種優(yōu)勢(shì),來(lái)實(shí)現(xiàn)豐富的現(xiàn)代互聯(lián)網(wǎng)應(yīng)用。
REST的六個(gè)特性:
- Client-Server:服務(wù)器端與客戶端分離。
- Stateless(無(wú)狀態(tài)):每次客戶端請(qǐng)求必需包含完整的信息,換句話說(shuō),每一次請(qǐng)求都是獨(dú)立的。
- Cacheable(可緩存):服務(wù)器端必需指定哪些請(qǐng)求是可以緩存的。
- Layered System(分層結(jié)構(gòu)):服務(wù)器端與客戶端通訊必需標(biāo)準(zhǔn)化,服務(wù)器的變更并不會(huì)影響客戶端。
- Uniform Interface(統(tǒng)一接口):客戶端與服務(wù)器端的通訊方法必需是統(tǒng)一的。
- Code on demand(按需執(zhí)行代碼?):服務(wù)器端可以在上下文中執(zhí)行代碼或者腳本
restful api
restful api 的概念就不介紹了。這里說(shuō)一下我們實(shí)現(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
說(shuō)明:
- rs為資源標(biāo)識(shí);
- 第二節(jié),user,會(huì)被解析為數(shù)據(jù)庫(kù)表名;
- 查詢時(shí),id為空或0時(shí),id會(huì)被忽略,即為列表查詢;
- 新建和修改,除接收f(shuō)orm表單外,url中的id參數(shù)也會(huì)被合并到參數(shù)集合中;
- 刪除同查詢。
讓flask支持正則表達(dá)式
flask默認(rèn)路由不支持正則表達(dá)式,而我需要截取完整的URL自己來(lái)解析,經(jīng)查詢,按以下步驟很容易完成任務(wù)。
- 使用werkzeug庫(kù) :from werkzeug.routing import BaseConverter
- 定義轉(zhuǎn)換器:
class RegexConverter(BaseConverter):
def __init__(self, map, *args):
self.map = map
self.regex = args[0]
- 注冊(cè)轉(zhuǎn)換器 : app.url_map.converters['regex'] = RegexConverter
- 用正則來(lái)截取url : @app.route('/rs/<regex(".*"):query_url>', methods=['PUT', 'DELETE', 'POST', 'GET'])
幾點(diǎn)疑問(wèn):
- 正則(.*)理論上應(yīng)該是匹配任何除回車(chē)的所有字符,但不知道為什么,在這里不識(shí)別問(wèn)號(hào)(?)
- 我用request.data來(lái)取表單數(shù)據(jù),為何request.form取不到?
- '/rs/<regex("."):query_url>'后若加個(gè)反斜杠('/rs/<regex("."):query_url>/'),request.data就取不到數(shù)據(jù),為什么?
解析json數(shù)據(jù)
解析json數(shù)據(jù)很容易,但我需要對(duì)客戶端送上來(lái)的數(shù)據(jù)進(jìn)行校驗(yà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ù),按請(qǐng)求的不同方式來(lái)組合我們需要的數(shù)據(jù)。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python模塊restful使用方法實(shí)例
- Python利用Django如何寫(xiě)restful api接口詳解
- 在Python的框架中為MySQL實(shí)現(xiàn)restful接口的教程
- Python restful框架接口開(kāi)發(fā)實(shí)現(xiàn)
- Python實(shí)現(xiàn)Restful API的例子
- Python中Flask-RESTful編寫(xiě)API接口(小白入門(mén))
- 使用Python & Flask 實(shí)現(xiàn)RESTful Web API的實(shí)例
- Python進(jìn)行Restful?API開(kāi)發(fā)實(shí)例詳解
- python用post訪問(wèn)restful服務(wù)接口的方法
- 探索?Python?Restful?接口測(cè)試的奧秘
相關(guān)文章
學(xué)習(xí)Python3 Dlib19.7進(jìn)行人臉面部識(shí)別
本篇文章主要給大家詳細(xì)介紹了Python3利用Dlib19.7進(jìn)行人臉面部識(shí)別的相關(guān)知識(shí),一起學(xué)習(xí)參考下吧。2018-01-01
用Python實(shí)現(xiàn)讀寫(xiě)鎖的示例代碼
這篇文章主要介紹了用Python實(shí)現(xiàn)讀寫(xiě)鎖的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Python實(shí)現(xiàn)的簡(jiǎn)單讀寫(xiě)csv文件操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)的簡(jiǎn)單讀寫(xiě)csv文件操作,結(jié)合實(shí)例形式分析了Python使用csv模塊針對(duì)csv文件進(jìn)行讀寫(xiě)操作的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2018-07-07
python常用庫(kù)之NumPy和sklearn入門(mén)
這篇文章主要介紹了python常用庫(kù)之NumPy和sklearn入門(mén),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
?Python使用Mediapipe對(duì)圖像進(jìn)行手部地標(biāo)檢測(cè)
本文將以深度庫(kù)即Mediapipe為基礎(chǔ)庫(kù),以及其他計(jì)算機(jī)視覺(jué)預(yù)處理的CV2庫(kù)來(lái)制作手部地標(biāo)檢測(cè)模型,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-03-03
Python基礎(chǔ)知識(shí)之函數(shù),類(lèi),模塊
今天小編就為大家分享一篇Python函數(shù),類(lèi),模塊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-10-10
Python 模擬生成動(dòng)態(tài)產(chǎn)生驗(yàn)證碼圖片的方法
這篇文章主要介紹了Python 模擬生成動(dòng)態(tài)產(chǎn)生驗(yàn)證碼圖片的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
python使用reportlab畫(huà)圖示例(含中文漢字)
這篇文章主要介紹了python使用reportlab畫(huà)圖示例,大家參考使用吧2013-12-12

