成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用python寫通用restful api service(一)

LoftySoul / 2326人閱讀

摘要:項目介紹用語言來寫一個,數(shù)據(jù)庫使用。如此選擇,主要目的是針對中小規(guī)模的網(wǎng)絡應用,能充分利用關系數(shù)據(jù)庫的種種優(yōu)勢,來實現(xiàn)豐富的現(xiàn)代互聯(lián)網(wǎng)應用。經(jīng)搜索,還需要配置后面兩個環(huán)境變量才能正常運行,大概原因是版本與之間的區(qū)別。

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

項目介紹

用python語言來寫一個restful api service,數(shù)據(jù)庫使用mysql。因為只做后端微服務,并且ORM的實現(xiàn)方式,采用自動生成SQL的方式來完成,因此選擇了輕量級的flask作為web框架。如此選擇,主要目的是針對中小規(guī)模的網(wǎng)絡應用,能充分利用關系數(shù)據(jù)庫的種種優(yōu)勢,來實現(xiàn)豐富的現(xiàn)代互聯(lián)網(wǎng)應用。

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為資源標識;

第二節(jié),user,會被解析為數(shù)據(jù)庫表名;

查詢時,id為空或0時,id會被忽略,即為列表查詢;

新建和修改,除接收form表單外,url中的id參數(shù)也會被合并到參數(shù)集合中;

刪除同查詢。

讓flask支持正則表達式

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

使用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來取表單數(shù)據(jù),為何request.form取不到?

"/rs/"):query_url>"后若加個反斜杠("/rs/"):query_url>/"),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)
pycharm項目配置

配置好Run/Debug Configurations才能在IDE中運行并單步調試,可以很熟悉flask框架的運行原理。

Script path : /usr/local/bin/flask

Parameters : run

環(huán)境變量

FLASK_APP = index.py

LC_ALL = en_US.utf-8

LANG = en_US.utf-8

本以為配置完上面三條就能運行了,因為在終端模擬器上就已經(jīng)能正常運行。結果在IDE中出現(xiàn)了一堆莫名的錯誤,仔細看,大概是編碼配置的問題。經(jīng)搜索,還需要配置后面兩個環(huán)境變量才能正常運行,大概原因是python版本2與3之間的區(qū)別。

完整代碼
git clone https://github.com/zhoutk/pyrest.git
cd pyrest
export FLASK_APP=index.py
flask run
小結

今天利用flask完成了web基礎架構,能夠正確解析URL,提取客戶端提交的數(shù)據(jù),按請求的不同方式來組合我們需要的數(shù)據(jù)。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/44533.html

相關文章

  • pythonrestful api service(二)

    摘要:今天項目已經(jīng)能夠做一個簡單的后端服務了,在中新建一個表,就能自動提供的服務了。函數(shù)用來區(qū)分是查詢還是執(zhí)行操作。字段組合值組合,由元組轉換為數(shù)組配置相應的占位符修改接口以字典形式提供參數(shù),占位符的形式為,只支持按主鍵進行修改。 今天項目已經(jīng)能夠做一個簡單的后端服務了,在mysql中新建一個表,就能自動提供restful api的CURD服務了。 關鍵點 根據(jù)REST的四種動詞形式,動態(tài)...

    liangzai_cool 評論0 收藏0
  • 自動化代碼生成工具 Snips 開發(fā)實踐

    摘要:今天我來和大家分享一下以及自動化生成工具的開發(fā)經(jīng)驗。代碼生成工具接著講講代碼生成工具,對于來講,有官方的代碼生成器,還有其他的同類開源項目比如?,F(xiàn)有的代碼生成器沒有可以開箱即用的,都需要去進行不少的修改。 前言 在開發(fā)工作中,經(jīng)常會遇到新產(chǎn)品、服務上線后,需要將其 API 編寫不同語言的 SDK。但不同語言 SDK 中都有很大一部分內(nèi)容是用來進行 API 的描述,而且這部分代碼量是最大...

    only_do 評論0 收藏0
  • 自動化代碼生成工具 Snips 開發(fā)實踐

    摘要:今天我來和大家分享一下以及自動化生成工具的開發(fā)經(jīng)驗。代碼生成工具接著講講代碼生成工具,對于來講,有官方的代碼生成器,還有其他的同類開源項目比如。現(xiàn)有的代碼生成器沒有可以開箱即用的,都需要去進行不少的修改。 前言 在開發(fā)工作中,經(jīng)常會遇到新產(chǎn)品、服務上線后,需要將其 API 編寫不同語言的 SDK。但不同語言 SDK 中都有很大一部分內(nèi)容是用來進行 API 的描述,而且這部分代碼量是最大...

    qc1iu 評論0 收藏0

發(fā)表評論

0條評論

LoftySoul

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<