作為測試人員,在工作或者學習的過程中,有時會沒有可以呼叫的現成的介面,導致我們的程式碼沒法除錯跑通的情況。
這時,我們使用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()
請求註冊介面,結果如下:
這裡需要注意:
-
請求程式碼中,我們指定了
headers = {"Content-Type": "application/json;charset=utf8"}
,則post請求引數的格式需要是json格式,且在介面程式碼中需要使用 request.json.get("username") 這種形式去獲取請求中對用的值。 -
同樣,如果不指定headers,則post請求引數不需要要是json格式,直接傳dict格式就行,這時介面程式碼中需要使用 request.values.get("username") 這種形式去獲取請求中對用的值。
傳送請求後,服務端會顯示收到的請求,如下所示:
總結
後續如果遇到需要使用介面除錯而又沒有現成的介面,那麼我們就可以按照上面的思路及說明,使用Flask編寫簡單的介面用於請求呼叫或者mock。
當然,程式碼中的一些細節並沒有做更細緻的說明,感興趣的同學可以去檢視Flask官方文件。