一直在用node.js做后端,要逐步涉獵大數據范圍,注定繞不過python/280962.html">python,因此決定把一些成熟的東西用python來重寫,一是開拓思路、通過比較來深入學習python;二是有目標,有動力,希望能持之以恒的堅持下去。
項目介紹
用python語言來寫一個restful api service,數據庫使用mysql。因為只做后端微服務,并且ORM的實現方式,采用自動生成SQL的方式來完成,因此選擇了輕量級的flask作為web框架。如此選擇,主要目的是針對中小規模的網絡應用,能充分利用關系數據庫的種種優勢,來實現豐富的現代互聯網應用。
REST的六個特性:
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說明:
讓flask支持正則表達式
flask默認路由不支持正則表達式,而我需要截取完整的URL自己來解析,經查詢,按以下步驟很容易完成任務。
class RegexConverter(BaseConverter): def __init__(self, map, *args): self.map = map self.regex = args[0]
幾點疑問:
解析json數據
解析json數據很容易,但我需要對客戶端送上來的數據進行校驗,下面是用異常處理又只解析一次的解決方案。
def check_json_format(raw_msg): try: js = json.loads(raw_msg, encoding='utf-8') except ValueError: return False, {} return True, jsURL解析
按既定協議解析URL,提取表名,為生成sql組合參數集合。
@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.gitcd restexport FLASK_APP=index.pyflask run
小結
今天利用flask完成了web基礎架構,能夠正確解析URL,提取客戶端提交的數據,按請求的不同方式來組合我們需要的數據。希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答