作為測試人員,在工作或者學習的過程中,有時會遇到沒有可以調用的現成的接口,導致我們的代碼沒法調試跑通的情況。
這時,我們使用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官方文檔。