Flask 開發(fā)(第一章)--- Flask安裝&網(wǎng)站提供API實例

第一章 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

  1. 運行 pip 確保你已經(jīng)做了基本的安裝 :
 > pip list
 pip (24.2)

2.命令行按裝 virtualenv

pip install virtualenv 
  • 命令行操作:
  1. 創(chuàng)建目錄 .venvs/
  2. 生成虛擬環(huán)境

virtualenv .venvs/
  • 命令行操作:
  • 效果:
  1. 激活虛擬環(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ù)處理邏輯。

加入POST請求支持

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ù)

Get 將表單中數(shù)據(jù)的按照 variable=value 的形式,添加到 action 所指向的 URL 后面,并且兩者使用“?”連接,而各個變量之間使用“&”連接;Post 是將表單中的數(shù)據(jù)放在 form 的數(shù)據(jù)體中,按照變量和值相對應(yīng)的方式,傳遞到 action 所指向 URL —— HTTP 方法:GET 對比 POST | 菜鳥教程 (runoob.com)

于是借助于工具,構(gòu)建請求體,工具為 postman:
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模擬)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容