日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python flask高级编程之restful_python Flask实现restful api service

發(fā)布時間:2025/3/12 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python flask高级编程之restful_python Flask实现restful api service 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一直在用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支持正則表達式

flask默認路由不支持正則表達式,而我需要截取完整的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/', methods=['PUT', 'DELETE', 'POST', 'GET'])

幾點疑問:

正則(.*)理論上應(yīng)該是匹配任何除回車的所有字符,但不知道為什么,在這里不識別問號(?)

我用request.data來取表單數(shù)據(jù),為何request.form取不到?

'/rs/'后若加個反斜杠('/rs//'),request.data就取不到數(shù)據(jù),為什么?

解析json數(shù)據(jù)

解析json數(shù)據(jù)很容易,但我需要對客戶端送上來的數(shù)據(jù)進行校驗,下面是用異常處理又只解析一次的解決方案。

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/', 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í)有所幫助,也希望大家多多支持腳本之家。

總結(jié)

以上是生活随笔為你收集整理的python flask高级编程之restful_python Flask实现restful api service的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。