python flask高级编程之restful_python Flask实现restful api service
一直在用node.js做后端,要逐步涉獵大數據范圍,注定繞不過python,因此決定把一些成熟的東西用python來重寫,一是開拓思路、通過比較來深入學習python;二是有目標,有動力,希望能持之以恒的堅持下去。
項目介紹
用python語言來寫一個restful api service,數據庫使用mysql。因為只做后端微服務,并且ORM的實現方式,采用自動生成SQL的方式來完成,因此選擇了輕量級的flask作為web框架。如此選擇,主要目的是針對中小規模的網絡應用,能充分利用關系數據庫的種種優勢,來實現豐富的現代互聯網應用。
REST的六個特性:
Client-Server:服務器端與客戶端分離。
Stateless(無狀態):每次客戶端請求必需包含完整的信息,換句話說,每一次請求都是獨立的。
Cacheable(可緩存):服務器端必需指定哪些請求是可以緩存的。
Layered System(分層結構):服務器端與客戶端通訊必需標準化,服務器的變更并不會影響客戶端。
Uniform Interface(統一接口):客戶端與服務器端的通訊方法必需是統一的。
Code on demand(按需執行代碼?):服務器端可以在上下文中執行代碼或者腳本
restful api
restful api 的概念就不介紹了。這里說一下我們實現協議形式:
[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為資源標識;
第二節,user,會被解析為數據庫表名;
查詢時,id為空或0時,id會被忽略,即為列表查詢;
新建和修改,除接收form表單外,url中的id參數也會被合并到參數集合中;
刪除同查詢。
讓flask支持正則表達式
flask默認路由不支持正則表達式,而我需要截取完整的URL自己來解析,經查詢,按以下步驟很容易完成任務。
使用werkzeug庫 :from werkzeug.routing import BaseConverter
定義轉換器:
class RegexConverter(BaseConverter):
def __init__(self, map, *args):
self.map = map
self.regex = args[0]
注冊轉換器 : app.url_map.converters['regex'] = RegexConverter
用正則來截取url : @app.route('/rs/', methods=['PUT', 'DELETE', 'POST', 'GET'])
幾點疑問:
正則(.*)理論上應該是匹配任何除回車的所有字符,但不知道為什么,在這里不識別問號(?)
我用request.data來取表單數據,為何request.form取不到?
'/rs/'后若加個反斜杠('/rs//'),request.data就取不到數據,為什么?
解析json數據
解析json數據很容易,但我需要對客戶端送上來的數據進行校驗,下面是用異常處理又只解析一次的解決方案。
def check_json_format(raw_msg):
try:
js = json.loads(raw_msg, encoding='utf-8')
except ValueError:
return False, {}
return True, js
URL解析
按既定協議解析URL,提取表名,為生成sql組合參數集合。
@app.route('/rs/', 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
小結
今天利用flask完成了web基礎架構,能夠正確解析URL,提取客戶端提交的數據,按請求的不同方式來組合我們需要的數據。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
總結
以上是生活随笔為你收集整理的python flask高级编程之restful_python Flask实现restful api service的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud —— Gate
- 下一篇: python转换窗口无响应_Tkinte