提到Python,不得不感嘆,簡直不要太好用...
那么在Python中如何編寫服務端的接口呢坏怪,方式有許多,今天主要說一下Flask绊茧,Flask是一個用Python編寫的Web應用程序框架铝宵,具有輕量級和簡潔性,還有強大的可擴展性等優(yōu)點华畏。
最簡單的示例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Flask!'
if __name__ == '__main__':
app.run(debug=True)
這樣我們就可以在瀏覽器訪問到最簡單的“Hello, Flask!”了鹏秋,不過前提是你已經成功安裝Flask 。
由于實際工作中可能會涉及更多內容唯绍,比如接收不同請求方式參數拼岳、數據庫的連接和操作、跨域解決等等一系列問題况芒,下面就進行一一解答惜纸。
cmd 安裝以下指令:
# 安裝指令
pip install pymysql
pip install flask
pip install flask_cors
打開Pycharm,在設置中查看Python解析器是否有這幾個軟件包绝骚,如果有則代表安裝成功耐版。
image.png
新建一個新文件,導入依賴包
# 需要用到的包引入
from pymysql import Connection
from flask import Flask, request, jsonify
from flask_cors import CORS
導入完畢后压汪,開始連接數據庫粪牲,我在本地已經成功安裝MySQL并且創(chuàng)建了test數據庫,里面有一張student表格止剖,如果沒有安裝請自行安裝并新建表格腺阳。
企業(yè)微信截圖_17134282429733.png
conn = Connection(
host="localhost",
port=3306,
user="root",
password="123456",
autocommit=True
)
# 獲取游標對象
cursor = conn.cursor()
# 選擇數據庫
conn.select_db("test")
接下來是啟動服務和解決跨域問題
# 后端服務啟動
app = Flask(__name__)
# 為所有路徑啟用CORS
CORS(app)
接下來是接口定義部分,直接貼代碼吧穿香,其實我注釋寫得還蠻多亭引,應該能看明白。
# 獲取列表數據
@app.route("/student/list", methods=['GET'])
def student_list():
# 獲取某個參數皮获,例如 'name'
name = request.args.get('name')
# 構造查詢語句
if name:
# 使用LIKE操作符和通配符%來查詢包含name的記錄
query = "select * from student where name like %s"
# 使用%%作為通配符%的轉義焙蚓,因為%在SQL中是特殊字符
cursor.execute(query, ('%' + name + '%',))
else:
# 如果沒有name參數,查詢所有記錄
query = "select * from student"
cursor.execute(query)
try:
# 獲取查詢結果
data = cursor.fetchall()
except Exception as e:
# 處理數據庫查詢異常
print(f"查詢異常: {e}")
return jsonify([]), 500
# 將結果轉換為字典列表
# 這段代碼使用了Python的列表推導式(list comprehension)來將一個數據庫查詢結果列表轉換為包含字典的列表
result = [
{
"id": row[0],
"name": row[1],
"age": row[2]
} for row in data
]
# 返回JSON響應
return jsonify(result)
# 增加一條數據
@app.route("/student", methods=['POST'])
def create_student():
name = request.form.get("name")
age = request.form.get("age")
ids = request.form.get("id") # 這個id其實不應該傳,應該是后端定一個規(guī)則自動生成的购公,這里偷懶了
if not name or not age or not ids:
return jsonify({"message": "缺少必填參數"}), 400
query = "insert into student (name, age, id) values (%s, %s, %s)"
try:
cursor.execute(query, (name, age, ids))
return jsonify({"message": f"學生{name}新增成功"}), 200
except Exception as e:
return jsonify({"message": str(e)}), 500
# 刪除某條數據
@app.route("/student/<int:student_id>", methods=['DELETE'])
def delete_student(student_id):
query = "delete from student where id=%s"
try:
cursor.execute(query, (student_id,))
return jsonify({"message": f"學生 {student_id} 刪除成功"}), 200
except Exception as e:
return jsonify({"message": str(e)}), 500
# 修改某條數據
@app.route("/student/<int:student_id>", methods=['PUT'])
def update_student(student_id):
name = request.form.get("name")
age = request.form.get("age")
if not name and not age:
return jsonify({"message": "缺少必要參數"}), 400
update_query = "update student set "
update_params = []
if name:
update_query += "name=%s, "
update_params.append(name)
if age:
update_query += "age=%s, "
update_params.append(age)
update_query = update_query.rstrip(', ')
query = f"{update_query} where id=%s"
update_params.append(student_id)
# print(query)
# print(update_params)
try:
cursor.execute(query, tuple(update_params))
return jsonify({"message": f"學生{name}信息更新成功"}), 200
except Exception as e:
return jsonify({"message": str(e)}), 500
最后定義運行在哪里以及端口號等
if __name__ == "__main__":
app.run("0.0.0.0", port=9090, debug=True)
conn.close() # 關閉數據庫連接
使用postman 測試一下查詢的接口:
企業(yè)微信截圖_17134290049260.png
查詢結果正確萌京,很完美!