使用 pre-request 優化 Flask 入參校驗

在使用Flask實現Restful接口時,需要對請求參數進行校驗以判斷其是否符合特定的規則。本文將介紹如何通過 pre-request 庫優化校驗邏輯。

接口需求

假設我們需要實現一個收集用戶填寫的個人信息的接口,該接口的具體需求如下:

  1. 接口路徑: /user/info/new
  2. 接口字段:
字段 類型 說明
userName string 用戶昵稱,必填,2-20位字符串
gender int 用戶性別,必填,1-男 2-女
age int 用戶年齡,必填,18-60之間的整數
country string 用戶國籍,選填,默認為 中國, 字符串長度為>2

接口實現

如果不借助任何第三方工具實現上述接口的話,代碼可能如下所示:

from flask import request, Flask


app = Flask(__name__)


@app.route("/user/info/new", methods=["POST"])
def user_info_handler():
    # 1.判斷用戶名稱參數是否合法
    user_name = request.form.get("userName")
    if not user_name or not isinstance(user_name, str):
        return "請填寫正確的用戶名稱"
    if len(user_name) < 2 or len(user_name) > 20:
        return "用戶名稱長度不正確"

    # 2.判斷用戶性別參數是否合法
    gender = request.form.get("gender")
    if not gender:
        return "請填寫用戶性別"
    try:
        gender = int(gender)
    except ValueError:
        return "用戶性別格式不正確"
    if gender not in [1, 2]:
        return "用戶性別參數必須在[1, 2]之間"

    # 3.判斷用戶年級參數是否合法
    age = request.form.get("age")
    if not age:
        return "請填寫用戶年齡"
    try:
        age = int(age)
    except ValueError:
        return "用戶年齡格式不正確"
    if age < 18 or age > 60:
        return "年齡必須在18-60之間"

    # 4.判斷國籍是否合法
    country = request.form.get("country", "中國")
    country = str(country)
    if len(country) < 2:
        return "國籍名稱長度不合法"
    
    # TODO: 用戶信息注冊邏輯
    return "Success"


if __name__ == "__main__":
    app.run(port=8080)

正如上面的代碼所示,為了保證存儲到數據庫中的數據符合設計要求,開發人員需要對入參做大量的校驗工作,稍有不慎就有可能為系統留下漏洞隱患。

使用 pre-request 校驗入參

同樣是實現上述的接口需求,我們來看一下通過pre-request如何將大量重復的校驗邏輯進行屏蔽。

from flask import Flask
from pre_request import pre, Rule


app = Flask(__name__)


rule = {
    "userName": Rule(type=str, required=True, gte=3, lte=20, dest="user_name"),
    "gender": Rule(type=int, required=True, enum=[1, 2]),
    "age": Rule(type=int, required=True, gte=18, lte=60),
    "country": Rule(type=str, required=False, gte=2, default="中國")
}


@app.route("/user/info/new", methods=["POST"])
def user_info_handler():
    params = pre.parse(rule=rule)
    # TODO: 用戶信息注冊邏輯
    return "Success"


if __name__ == "__main__":
    app.run(port=8080)

如上方所示,復雜的參數校驗工作變成了校驗規則的編寫,pre.parse 函數會自動捕獲請求參數并判斷是否符合校驗規則,不符合校驗規則時會自動生成錯誤響應,用戶不需要做任何處理。

pre-request 相關鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,933評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,958評論 6 342
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,150評論 6 13
  • 上一篇《WEB請求處理一:瀏覽器請求發起處理》,我們講述了瀏覽器端請求發起過程,通過DNS域名解析服務器IP,并建...
    七寸知架構閱讀 81,227評論 21 356
  • 禮儀之邦的中國,從孩堤及白發蒼蒼老人,都以身作則的示范文明之邦。但我覺得最奇妙,神奇的詞語便是,謝謝!因...
    書_贏閱讀 467評論 0 1