国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用python寫通用restful api service(一)

LoftySoul / 2314人閱讀

摘要:項目介紹用語言來寫一個,數據庫使用。如此選擇,主要目的是針對中小規模的網絡應用,能充分利用關系數據庫的種種優勢,來實現豐富的現代互聯網應用。經搜索,還需要配置后面兩個環境變量才能正常運行,大概原因是版本與之間的區別。

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

項目介紹

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

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

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

Script path : /usr/local/bin/flask

Parameters : run

環境變量

FLASK_APP = index.py

LC_ALL = en_US.utf-8

LANG = en_US.utf-8

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

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

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

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

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

相關文章

  • pythonrestful api service(二)

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

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

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

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

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

    qc1iu 評論0 收藏0

發表評論

0條評論

LoftySoul

|高級講師

TA的文章

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