於進入主題了,前面的准備工作都已經做好了,下面就開始寫邏輯的代碼了,代碼我已經寫好了,每行都加了注釋,不明白的可以留言。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
#api.py
from flask import Flask ,jsonify,request
import sqlite3
#因為有些異常情況的時候需要提示異常信息,所以咱們需要事先定義一些錯誤信息,以及錯誤碼
#請求方式錯誤
method_err = {
"code":301,
"msg":"請求方式不正確,只支持post請求"
}
#參數錯誤
param_err = {
"code":302,
"msg":"請求參數錯誤,請檢查入參"
}
#余額不足
money_err = {
"code":303,
"msg":"賬戶余額不足"
}
#價格錯誤
price_err = {
"code":304,
"msg":"價格不合法"
}
#用戶不存在
user_err = {
"code":305,
"msg":"該用戶不存在"
}
#成功的信息
success_msg = {
"code":200,
"msg":"支付成功"
}
#數據庫異常
db_err = {
"code":306,
"msg":"數據庫錯誤"
}
#導入我們需要用到的模塊,Flask是用來創建我們寫的這個接口的服務
#jsonify是用來序列化json的,因為http_api接口都是返回的json串
#request是用來獲取調用接口的時候傳入的數據,這幾個模塊都是falsk里面的
app = Flask(__name__)
#這個是初始化一個服務,__name__代表是咱們寫的這個python文件,
#也就是咱們這個python文件就是一個服務了,然后賦值給app,app就代表這個服務了
app.config['JSON_AS_ASCII'] = False
#支付的時候,傳入金額,金額可能有小數類型的,也可能有整數類型的
#因為python里面沒有一個內置的方法去判斷字符串是不是小數,所有下面自己寫了
#一個方法去校驗是否為正小數
def check_float(string):
str1 = str(string)
if str1.count('.') > 1: # 判斷小數點是不是大於1
return False
elif str1.count('-') > 0: # 判斷負號的個數,如果大於0就是非法的
return False
elif str1.isdigit():
return False # 判斷是不是整數
else:
new_str = str1.split('.') # 按小數點分割字符
frist_num = new_str[0] # 取分割完之后這個list的第一個元素
if frist_num.isdigit() and new_str[1].isdigit():
# 如果小數點兩邊都是整數的話,那么就是一個小數
return True
else:
return False
#因后面要經常操作數據,咱們就寫一個函數專門來操作數據庫
def op_db(sql):
db = sqlite3.connect(r'C:\Users\admin\Desktop\my.db') # 指定數據庫
course = db.cursor() # 創建游標
try:#捕捉異常,如果有sql寫的不對就返回異常
course.execute(sql) # 執行sql
except sqlite3.Error as e:
#出異常了就返回錯誤信息
return False
else:
res = course.fetchone()
#獲取查詢結果
db.commit()
return res
#返回數據
finally:
#不管出沒出異常都關閉數據庫
course.close()
db.rollback()#回滾
db.close()
def check_balance(user_id, price):
select_sql = 'select money from accounts where user_id = %s;'%user_id
data = op_db(select_sql) # 獲取sql執行的結果
if data: # 如果返回的數據不是空的話
if not data:
#not就是取反的意思,如果返回False的話,就是真了,就說明出錯了,返回數據庫錯誤
return db_err
else: # 如果select有結果的話,就獲取到這個用戶的賬號信息
money = data[0]#數據庫獲取到的結果是一個元組,就一個元素就是價格
if money >= price: # 如果賬戶余額大於等於價格的話,修改價格
target_money = money - price
#更新余額的sql
update_sql = 'update accounts set money = %s where user_id = %s;'%(target_money,user_id)
op_db(update_sql) # 更新余額
return success_msg # 返回成功信息
else: # 如果余額不足的話,返回余額錯誤信息
return money_err
else: # 如果數據是空,就是用戶信息獲取不到
return user_err
#這個是給咱們剛才創建的服務加一個路由,也就是指定這個接口的訪問url,
# 支持什么請求方式,get或者post請求,route方法第一個參數就是訪問的路徑,
# methods是支持哪種類型的請求,route方法是一個裝飾器,必須寫在業務邏輯的函數上面
@app.route('/pay',methods=['POST','GET'])
def pay():
#def pay()就是定義一個函數,這個函數里面寫的就是接口的業務邏輯了
if request.method != 'POST':#如果不是post請求的話,返回請求類型錯誤
return jsonify(method_err)
#return 就返回數據了,jsonify就是把python里面的數據類型(字典、list)轉成json串
else:
user_id = request.values.get('user_id')
#使用request.values.get獲取到傳入的參數,user_id
price = request.values.get('price')
#獲取到支付的價格
if user_id and price:
#判斷兩個入參是否都傳了,user_id和price
if price.isdigit():#如果價格是整數的話
price = int(price)
#接收過來的入參是字符串類型的,所以要轉成int類型的,才可以加減
elif check_float(price):
#這里調用了一個函數,在上面定義了,是校驗傳入的價格是不是小數的
price = float(price)
else:#如果不是整數也不是小數,返回價格錯誤
return jsonify(param_err)
#上面都校驗通過之后,數據就是合法的,就得扣錢了,那就是操作數據庫
#再寫一個函數專門用來扣錢
res = check_balance(user_id,price)#調用檢查余額函數
return jsonify(res)#返回結果
else:#如果name或者價格獲取不到的話,返回參數錯誤
return jsonify(param_err)
if __name__=='__main__':
app.run(debug=True)#運行程序,debug的意思是調試模式運行,可以看到請求,默認端口號是5000,可以使用port參數指定端
口號
#運行完之后會顯示這樣的
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
|
ok,代碼就是上面的,每個單獨的功能都拆分出來做了單獨的函數來工作,這樣代碼就不會顯得比較亂了。
下面咱們來測試一下,看看有沒有bug
先來個正常的通過性測試:
再來倆異常驗證,一個價格錯誤的,一個用戶不存在的。
大功告成,都驗證通過了,當然還有很多沒有驗證,留着大家動動手吧。