第一章 Flask安裝&網(wǎng)站提供API實例 無授權(quán)直接提供服務(wù)
第二章 用戶憑證 授權(quán)才可訪問API(文件授權(quán)&數(shù)據(jù)庫授權(quán))
1. 虛擬環(huán)境和項目的創(chuàng)建
虛擬環(huán)境 解決的問題:
-
開發(fā)過程,遇到某個第三包,AB兩個項目需要用到不同版本時
- 另一個必要性:便于統(tǒng)計 項目用到了哪些第三方包。
1.1 項目目錄和生成虛擬環(huán)境
綜合參考了 一個項目骨架《笨辦法學(xué)Python》 和 02 虛擬環(huán)境和項目的創(chuàng)建_嗶哩嗶哩_bilibili
- 運行 pip 確保你已經(jīng)做了基本的安裝 :
> pip list
pip (24.2)
2.命令行按裝 virtualenv
pip install virtualenv
-
命令行操作:
-
創(chuàng)建目錄 .venvs/
生成虛擬環(huán)境
virtualenv .venvs/
-
命令行操作:
-
效果:
- 激活虛擬環(huán)境
運行activate.bat腳本。其位于.venvs/Scripts/activate.bat。
命令行執(zhí)行:
.venvs/Scripts/activate.bat
-
命令:
-
腳本位置:
-
成功進入虛擬環(huán)境標(biāo)志:image.png
1.2 Flask庫安裝
和安裝requests庫 pip install requests一樣。
- 安裝 flask
pip install flask
- 生成requirements.txt
pip freeze > requirements.txt
-
生成效果 image.png
2. Flask編寫第一個網(wǎng)站
2.1 完整源碼
比如此文件名為
v1.py
from flask import Flask
app = Flask(__name__)
# http://127.0.0.1:5000/index ->執(zhí)行index
@app.route("/index")
def index():
return "成功"
# http://127.0.0.1:5000/home ->執(zhí)行home
@app.route("/home")
def home():
return "失敗"
if __name__ == '__main__':
app.run(host="127.0.0.1",port=5000) # 無參調(diào)用時就是 默認(rèn)用這ip和端口號
- 一般情況下建議: route的路徑 建議和 定義的回調(diào)函數(shù)名相關(guān)聯(lián)。比如 此代碼示例中,函數(shù)名和route路徑名 保持一致。
- 運行:
python v1.py。運行此源碼文件。 -
服務(wù)器啟動顯示:
2.2 瀏覽器訪問效果:
3. 處理GET請求--服務(wù)器從URL中取出變量的值
- 瀏覽器端改動 URL,比如這樣:
http://127.0.0.1:5000/index?age=19&pwd=123
- 比如獲取age則 age =
request.args.get('age') - 比如獲取pwd則 pwd =
request.args.get('pwd')
3.1 完整代碼:
from flask import Flask,request
app = Flask(__name__)
# http://127.0.0.1:5000/index ->執(zhí)行index, 請求GET
@app.route("/index", methods = ['GET','POST']) # 方法參數(shù)將POST加入列表,這參數(shù)默認(rèn)只有GET。
def index():
age = request.args.get('age')
pwd = request.args.get('pwd')
print(age,pwd)
return "成功"
# http://127.0.0.1:5000/home ->執(zhí)行home ,請求GET
@app.route("/home")
def home():
age = request.args.get('age')
pwd = request.args.get('pwd')
print(age,pwd)
return "失敗"
if __name__ == '__main__':
app.run(host="127.0.0.1",port=5000) # 無參調(diào)用時就是 默認(rèn)用這ip和端口號
4. 處理POST請求--服務(wù)器取得請求體數(shù)據(jù)
修改app.route裝飾以及函數(shù)處理邏輯。

4.1 完整代碼:
from flask import Flask,request
app = Flask(__name__)
# http://127.0.0.1:5000/index ->執(zhí)行index, 請求GET
@app.route("/index", methods = ['GET','POST']) # 方法參數(shù)將POST加入列表,這參數(shù)默認(rèn)只有GET。
def index():
age = request.args.get('age')
pwd = request.args.get('pwd')
print(age,pwd)
xx = request.form.get('xx')
yy = request.form.get('yy')
print(xx,yy)
return "成功"
# http://127.0.0.1:5000/home ->執(zhí)行home ,請求GET
@app.route("/home", methods = ['GET','POST']) # 方法參數(shù)將POST加入列表,這參數(shù)默認(rèn)只有GET。
def home():
age = request.args.get('age')
pwd = request.args.get('pwd')
print(age,pwd)
xx = request.form.get('xx')
yy = request.form.get('yy')
print(xx,yy)
return "失敗"
if __name__ == '__main__':
app.run(host="127.0.0.1",port=5000) # 無參調(diào)用時就是 默認(rèn)用這ip和端口號
4.2 瀏覽器端模擬POST請求提交form-data數(shù)據(jù)
于是借助于工具,構(gòu)建請求體,工具為 postman:Get 將表單中數(shù)據(jù)的按照 variable=value 的形式,添加到 action 所指向的 URL 后面,并且兩者使用“?”連接,而各個變量之間使用“&”連接;Post 是將表單中的數(shù)據(jù)放在 form 的數(shù)據(jù)體中,按照變量和值相對應(yīng)的方式,傳遞到 action 所指向 URL —— HTTP 方法:GET 對比 POST | 菜鳥教程 (runoob.com)

postman
4.2.1 postman安裝方法:

-
安裝完然后continue without a account
-
進入輕量級客戶端
4.2.2 postman發(fā)起 POST請求


- 若是把URL修改為
http://127.0.0.1:5000/index?age=19&pwd=123。則GET請求的處理過程也能取到值。
4.3 服務(wù)器端處理json數(shù)據(jù)
request.json直接取得json格式的字典:
print(request.json)
-
添加到 原來的處理邏輯中:
4.4 瀏覽器端模擬POST請求提交json數(shù)據(jù)
一般性的操作和 發(fā)送form-data一樣。只是Body選擇和Body的構(gòu)成不一樣??聪聢D:
-
響應(yīng)結(jié)果如下圖:
5.服務(wù)器返回 json格式的字符串
引入Flask內(nèi)置模塊 jsonify。將字典數(shù)據(jù) 實例化為 json形式的響應(yīng)數(shù)據(jù)對象。
5.1 完整源碼
from flask import Flask,request,jsonify
app = Flask(__name__)
# http://127.0.0.1:5000/index ->執(zhí)行index, 請求GET
@app.route("/index", methods = ['GET','POST']) # 方法參數(shù)將POST加入列表,這參數(shù)默認(rèn)只有GET。
def index():
return jsonify({'status':True,'data':0x1122aabb})
if __name__ == '__main__':
app.run(host="127.0.0.1",port=5000) # 無參調(diào)用時就是 默認(rèn)用這ip和端口號

瀏覽器端訪問 127.0.0.1:5000/index,將得到以下結(jié)果

image.png
6. 服務(wù)器提供API的實際例子
6.1 服務(wù)器完整源碼
from flask import Flask,request,jsonify
import hashlib
app = Flask(__name__)
@app.route("/bili", methods = ['POST']) # 設(shè)置此API只支持POST
def bili():
"""
請求的數(shù)據(jù)格式要求: { "ordered_string":"......" }
"""
ordered_string = request.json.get("ordered_string")
if not ordered_string :
return jsonify({'status':False,'error':"參數(shù)錯誤"})
# 調(diào)用核心算法生成sign簽名 (簡單的例子是:拼接一個選定字符串然后做哈希計算)
encrypted_string = ordered_string + "560c52ccd288fed04585"
obj = hashlib.md5(encrypted_string.encode('utf-8'))
sign = obj.hexdigest()
return jsonify({'status':True,'data':sign})
if __name__ == '__main__':
app.run(host="127.0.0.1",port=5000) # 無參調(diào)用時就是 默認(rèn)用這ip和端口號
6.2 客戶端請求演示(postman模擬)


















