使用Flask開發簡單介面

給你一頁白紙發表於2022-02-25

作為測試人員,在工作或者學習的過程中,有時會沒有可以呼叫的現成的介面,導致我們的程式碼沒法除錯跑通的情況。

這時,我們使用python中的web框架Flask就可以很方便的編寫簡單的介面,用於呼叫或除錯。在之前的pytest系列文章中,已經使用過Flask編寫介面用於程式碼除錯。相比於python的另一個web框架Django,Flask編寫介面要方便簡單很多。

那麼,接下來就告訴大家如何使用Flask編寫簡單的介面吧。

安裝Flask

安裝命令:pip install flask

驗證是否安裝成功或檢視版本命令:pip show flask

建立專案

建立資料夾-->Pycharm開啟即可,或者直接在Pycharm中新建專案。例如,在桌面新建demo資料夾,Pycharm開啟,示例如下:

接下來就可以在demo專案中新建模組編寫程式碼了。

編寫介面程式碼

這裡示例編寫get、post兩種方式的介面,用於模擬請求呼叫。

專案中新建模組demo_app.py,編寫程式碼如下:

from flask import Flask, jsonify, request
import re

app = Flask(__name__)

# 使通過jsonify返回的中文顯示正常,否則顯示為ASCII碼
app.config["JSON_AS_ASCII"] = False

# 因為是簡單模擬,所以資料就以下面字典形式儲存,而不是儲存在資料庫
user_data = [
    {"id": 1, "username": "劉德華", "password": "123456", "telephone": "13838395588"},
    {"id": 2, "username": "梅豔芳", "password": "666666", "telephone": "13843895511"},
    {"id": 3, "username": "陳百強", "password": "888888", "telephone": "13853895510"}
]

@app.route("/users", methods=["GET"])
def get_all_users():
    """
    查詢所有使用者資訊
    :return:
    """
    return jsonify({"code": 1000, "data": user_data, "msg": "查詢成功"})

@app.route("/users/<int:user_id>", methods=["GET"])
def get_user(user_id):
    """
    查詢某個使用者資訊
    :param user_id: 使用者id
    :return:
    """
    if user_id > 0 and user_id <= len(user_data):
        return jsonify({"code": 1000, "data": user_data[user_id - 1], "msg": "查詢成功"})
    return jsonify({"code": 1000, "msg": "使用者不存在"})


@app.route("/register", methods=['POST'])
def user_register():
    """
    註冊使用者
    :return:
    """
    # request.json.get("username")即從傳送的json格式的請求引數中獲取username的值
    username = request.json.get("username").strip() # 使用者名稱
    password = request.json.get("password").strip() # 密碼
    telephone = request.json.get("telephone", "").strip() # 手機號,預設為空串
    if username and password and telephone:
        if username in ("劉德華", "梅豔芳", "張學友"):
            return jsonify({"code": 2001, "msg": "使用者名稱已存在!"})
        elif not (len(telephone) == 11 and re.match("^1[3,5,7,8]\d{9}$", telephone)):
            return jsonify({"code": 4001, "msg": "手機號格式不正確!"})
        else:
            return jsonify({"code": 1000, "msg": "註冊成功!"})
    else:
        return jsonify({"code": 2001, "msg": "使用者名稱/密碼/手機號不能為空,請檢查!"})


@app.route("/login", methods=['POST'])
def user_login():
    """
    登入
    :return:
    """
    username = request.json.get("username")
    password = request.json.get("password")
    if username and password:
        if username == "劉德華" and password == "123456":
            return jsonify({"code": 1000, "msg": "登入成功!", "token": "sh34ljjl08s32730dj"})
        return jsonify({"code": 4001, "msg": "使用者名稱或密碼錯誤!"})
    else:
        return jsonify({"code": 2001, "msg": "使用者名稱或密碼不能為空!"})



if __name__ == '__main__':
    app.run(debug=True)

程式碼說明如下:

  • 以上程式碼包含4個介面,其中,查詢所有使用者、查詢單個使用者介面為GET請求,註冊、登入介面為POST請求。

  • 只是編寫簡單的模擬介面,所以無需跟資料庫有互動,資料可以直接放在程式碼中以字典或其他格式儲存。

  • 返回的資料不能為dict形式,需要序列化為json格式,序列化可以使用json.dumps(),也可以使用flask模組中自帶的jsonify

  • @app.route()中指定了介面的路徑及請求方式,如@app.route("/login", methods=['POST']),路勁為/login,請求方式為post。

  • app.run()中可不指定服務執行的host及埠,預設為http://127.0.0.1:5000/,此時服務不能被同一區域網的其他機器訪問。

  • 指定host為0.0.0.0,如app.run(host="0.0.0.0", port=8888),埠不做要求,不被佔用就行,這樣服務就可以被同一區域網的其他機器訪問了。

  • app.run()debug=True的作用是啟用Flask專案的調式模式 (修改程式碼後只需ctrl+s儲存即可更新服務),否則每次修改程式碼之後都需要重新啟動服務 (即重新執行程式碼) 才能生效。

執行模組後,Pycharm中顯示如下:

該介面服務啟動成功,介面請求地址為http://127.0.0.1:5000/,且已經開啟的除錯模式,接下來就可以去請求這些介面了。

呼叫介面

我們可以使用postman或者其他工具請求以上介面,這裡使用python程式碼編寫呼叫上面的介面,示例程式碼如下:

def demo_login():
    '''請求登入介面'''
    headers = {"Content-Type": "application/json;charset=utf8"}
    url = "http://127.0.0.1:5000/login"
    data = {
        "username": "劉德華",
        "password": "123456"
    }
    res = requests.post(url=url, headers=headers, json=data).text
    print(res)


def demo_register():
    '''請求註冊介面'''
    headers = {"Content-Type": "application/json;charset=utf8"}
    url = "http://127.0.0.1:5000/register"
    data = {
        "username": "郭富城",
        "password": "12345",
        "telephone": "18638385431"
    }
    res = requests.post(url=url, headers=headers, json=data).text
    print(res)

def demo_get_user():
    '''請求查詢介面'''
    headers = {"Content-Type": "application/json;charset=utf8"}
    url = "http://127.0.0.1:5000/users/3"
    res = requests.get(url=url, headers=headers).text
    print(res)
    

if __name__ == '__main__':
    # demo_login()
    # demo_get_user()
    demo_register()

執行demo_register()請求註冊介面,結果如下:

這裡需要注意:

  1. 請求程式碼中,我們指定了headers = {"Content-Type": "application/json;charset=utf8"},則post請求引數的格式需要是json格式,且在介面程式碼中需要使用 request.json.get("username") 這種形式去獲取請求中對用的值。

  2. 同樣,如果不指定headers,則post請求引數不需要要是json格式,直接傳dict格式就行,這時介面程式碼中需要使用 request.values.get("username") 這種形式去獲取請求中對用的值。

傳送請求後,服務端會顯示收到的請求,如下所示:

總結

後續如果遇到需要使用介面除錯而又沒有現成的介面,那麼我們就可以按照上面的思路及說明,使用Flask編寫簡單的介面用於請求呼叫或者mock。

當然,程式碼中的一些細節並沒有做更細緻的說明,感興趣的同學可以去檢視Flask官方文件。

相關文章