最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python Flask實(shí)現(xiàn)restful api service

 更新時(shí)間:2017年12月04日 09:48:29   作者:zhoutk  
本篇文章主要介紹了python Flask實(shí)現(xiàn)restful api service,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

一直在用node.js做后端,要逐步涉獵大數(shù)據(jù)范圍,注定繞不過python,因此決定把一些成熟的東西用python來重寫,一是開拓思路、通過比較來深入學(xué)習(xí)python;二是有目標(biāo),有動(dòng)力,希望能持之以恒的堅(jiān)持下去。

項(xiàng)目介紹

用python語言來寫一個(gè)restful api service,數(shù)據(jù)庫使用mysql。因?yàn)橹蛔龊蠖宋⒎?wù),并且ORM的實(shí)現(xiàn)方式,采用自動(dòng)生成SQL的方式來完成,因此選擇了輕量級(jí)的flask作為web框架。如此選擇,主要目的是針對(duì)中小規(guī)模的網(wǎng)絡(luò)應(yīng)用,能充分利用關(guān)系數(shù)據(jù)庫的種種優(yōu)勢(shì),來實(shí)現(xiàn)豐富的現(xiàn)代互聯(lián)網(wǎng)應(yīng)用。

REST的六個(gè)特性:

  1. Client-Server:服務(wù)器端與客戶端分離。
  2. Stateless(無狀態(tài)):每次客戶端請(qǐng)求必需包含完整的信息,換句話說,每一次請(qǐng)求都是獨(dú)立的。
  3. Cacheable(可緩存):服務(wù)器端必需指定哪些請(qǐng)求是可以緩存的。
  4. Layered System(分層結(jié)構(gòu)):服務(wù)器端與客戶端通訊必需標(biāo)準(zhǔn)化,服務(wù)器的變更并不會(huì)影響客戶端。
  5. Uniform Interface(統(tǒng)一接口):客戶端與服務(wù)器端的通訊方法必需是統(tǒng)一的。
  6. Code on demand(按需執(zhí)行代碼?):服務(wù)器端可以在上下文中執(zhí)行代碼或者腳本

restful api

restful api 的概念就不介紹了。這里說一下我們實(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

說明:

  1. rs為資源標(biāo)識(shí);
  2. 第二節(jié),user,會(huì)被解析為數(shù)據(jù)庫表名;
  3. 查詢時(shí),id為空或0時(shí),id會(huì)被忽略,即為列表查詢;
  4. 新建和修改,除接收form表單外,url中的id參數(shù)也會(huì)被合并到參數(shù)集合中;
  5. 刪除同查詢。

讓flask支持正則表達(dá)式

flask默認(rèn)路由不支持正則表達(dá)式,而我需要截取完整的URL自己來解析,經(jīng)查詢,按以下步驟很容易完成任務(wù)。

  1. 使用werkzeug庫 :from werkzeug.routing import BaseConverter
  2. 定義轉(zhuǎn)換器:
class RegexConverter(BaseConverter):

  def __init__(self, map, *args):
    self.map = map
    self.regex = args[0]
  1. 注冊(cè)轉(zhuǎn)換器 : app.url_map.converters['regex'] = RegexConverter
  2. 用正則來截取url : @app.route('/rs/<regex(".*"):query_url>', methods=['PUT', 'DELETE', 'POST', 'GET'])

幾點(diǎn)疑問:

  1. 正則(.*)理論上應(yīng)該是匹配任何除回車的所有字符,但不知道為什么,在這里不識(shí)別問號(hào)(?)
  2. 我用request.data來取表單數(shù)據(jù),為何request.form取不到?
  3. '/rs/<regex("."):query_url>'后若加個(gè)反斜杠('/rs/<regex("."):query_url>/'),request.data就取不到數(shù)據(jù),為什么?

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

解析json數(shù)據(jù)很容易,但我需要對(duì)客戶端送上來的數(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)求的不同方式來組合我們需要的數(shù)據(jù)。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python使用pyodbc連接sqlserver

    python使用pyodbc連接sqlserver

    本文主要介紹了python使用pyodbc連接sqlserver,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python如何使用__slots__實(shí)現(xiàn)節(jié)省內(nèi)存和性能優(yōu)化

    Python如何使用__slots__實(shí)現(xiàn)節(jié)省內(nèi)存和性能優(yōu)化

    你有想過,一個(gè)小小的 __slots__ 能讓你的 Python 類內(nèi)存消耗直接減半嗎,沒錯(cuò),今天咱們要聊的就是這個(gè)讓人眼前一亮的技巧,感興趣的小伙伴可以了解下
    2025-03-03
  • python防止程序超時(shí)的實(shí)現(xiàn)示例

    python防止程序超時(shí)的實(shí)現(xiàn)示例

    因?yàn)槟硞€(gè)需求,需要在程序運(yùn)行的時(shí)候防止超時(shí),本文主要介紹了python防止程序超時(shí)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 使用Python構(gòu)建帶GUI的郵件自動(dòng)發(fā)送工具

    使用Python構(gòu)建帶GUI的郵件自動(dòng)發(fā)送工具

    在本篇博客中,我們將深入解析一個(gè)使用 wxPython 構(gòu)建的郵件發(fā)送器 GUI 程序,這個(gè)工具能夠自動(dòng)查找指定目錄中的文件作為附件,并提供郵件發(fā)送功能,本文將從功能、代碼結(jié)構(gòu)、關(guān)鍵技術(shù)等方面進(jìn)行詳細(xì)分析,需要的朋友可以參考下
    2025-03-03
  • 一小時(shí)學(xué)會(huì)TensorFlow2之Fashion Mnist

    一小時(shí)學(xué)會(huì)TensorFlow2之Fashion Mnist

    這篇文章主要介紹了TensorFlow2之Fashion Mnist,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 解讀時(shí)間序列分析之ADF檢驗(yàn)

    解讀時(shí)間序列分析之ADF檢驗(yàn)

    這篇文章主要介紹了解讀時(shí)間序列分析之ADF檢驗(yàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 基于python腳本實(shí)現(xiàn)軟件的注冊(cè)功能(機(jī)器碼+注冊(cè)碼機(jī)制)

    基于python腳本實(shí)現(xiàn)軟件的注冊(cè)功能(機(jī)器碼+注冊(cè)碼機(jī)制)

    用戶運(yùn)行程序后,通過文件自動(dòng)檢測認(rèn)證狀態(tài),如果未經(jīng)認(rèn)證,就需要注冊(cè)。這篇文章主要介紹了基于python腳本實(shí)現(xiàn)軟件的注冊(cè)功能(機(jī)器碼+注冊(cè)碼機(jī)制)的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Django objects的查詢結(jié)果轉(zhuǎn)化為json的三種方式的方法

    Django objects的查詢結(jié)果轉(zhuǎn)化為json的三種方式的方法

    這篇文章主要介紹了Django objects的查詢結(jié)果轉(zhuǎn)化為json的三種方式的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • python實(shí)現(xiàn)石頭剪刀布小游戲

    python實(shí)現(xiàn)石頭剪刀布小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)石頭剪刀布小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • PyQt5 QListView 高亮顯示某一條目的案例

    PyQt5 QListView 高亮顯示某一條目的案例

    這篇文章主要介紹了PyQt5 QListView 高亮顯示某一條目的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評(píng)論

芷江| 屏边| 太仓市| 石楼县| 新河县| 和硕县| 岗巴县| 禹州市| 沧州市| 仲巴县| 刚察县| 常德市| 青浦区| 定远县| 广宁县| 赣榆县| 镇远县| 雷山县| 两当县| 武义县| 宜阳县| 安乡县| 徐汇区| 崇义县| 常山县| 城固县| 秦安县| 濮阳市| 大城县| 措勤县| 鹤壁市| 邛崃市| 莲花县| 资源县| 连云港市| 交城县| 镇远县| 西贡区| 惠州市| 吉水县| 柘城县|