使用Flask開發簡單接口


作為測試人員,在工作或者學習的過程中,有時會遇到沒有可以調用的現成的接口,導致我們的代碼沒法調試跑通的情況。

這時,我們使用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官方文檔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM