Flask中獲取參數(路徑,查詢,請求體,請求頭)


上一篇中已經講述了:HTTP協議向服務器傳參有幾種途徑{ 鏈接 }

在Flask中同樣通過這4中傳參途徑進行歸納:

1. URL中路徑參數的獲取:

拓展:

  • # 路由參數/路徑參數:http://127.0.0.1:5000/users/13312345678
  • # 路由查詢參數:http://127.0.0.1:5000/users/?mobile=13312345678&?user_name="yd"

1.1 是什么?

  Flask不同於Django直接在定義路由時編寫正則表達式的方式,而是采用轉換器;

1.2 怎么用?

  • 1.語法:<>

  • 2.作用:提取URL路徑參數

  • 3.效果:將該位置數據以字符串格式匹配,值同樣為字符串類型,轉換器中的值為參數名傳入視圖

  • 4.案例  
# 127.0.0.1/user/123
@app.route('/users/<user_id>') def user_info(user_id): print(type(user_id)) return 'hello user {}'.format(user_id)
  • 5.轉換器原理:

導包:`from werkzeug.routing import BaseConverter`,進入BaseConverter通過繼承查看。

  • 6.Flask默認轉換器:共6種+1個默認
DEFAULT_CONVERTERS = {
    "default": UnicodeConverter,
    "string": UnicodeConverter,
    "any": AnyConverter,
    "path": PathConverter,
    "int": IntegerConverter,
    "float": FloatConverter,
    "uuid": UUIDConverter,
}
  • 7.轉換器string和path的區別:
http://127.0.0.1:5000/users/4/2/3
# @app.route('/users/<path:user_id>')
# user_id=4/2/3

@app.route('/users/<string:user_id>')
# 找不到
http://127.0.0.1:5000/users/4
# 只能匹配到/users/ 斜線后面部分
# user_id=4

# string匹配的轉換器所在位置的數據,不帶斜線
# path配置轉換器所在位置的數據,包括(除# ?之外的所有符號【包括中引文不同狀態】)
  • 8.自定義轉換器
  • 8.1為什么?

    內置轉換器不滿足需求時,自定義匹配

  • 8.2怎么做?

    參考源碼實現

    #app文件導包routing中的map類,app.py中類屬性 = routing中的 map類, map類屬性:self.converters = self.default_converters.copy() 。。。
  • 8.3實現步驟:

    1. 定義類

    2. 繼承BaseConverter

    3. 定義正則表達式

    4. 把自定義轉換器,添加到默認轉換字典中

  8.4案例:

# 個人練習:匹配學號--2015100446
class StuIdConverter(BaseConverter):
    regex = "20[0-5]{2}100\d[0-9]{2}"

# 添加自定義轉換器到默認轉換器字典中
app.url_map.converters['stu_id'] = StuIdConverter

@app.route('/<stu_id:data>')
def get_stu_id(data):
    print("stu_id={}".format(data))
    return 'stu_id value is stu_id={}'.format(data)

2.查詢參數,請求頭,請求體

  使用請求上下文對象request獲取

屬性 說明 類型
data 記錄請求的數據,並轉換為字符串 *
form 記錄請求中的表單數據 MultiDict
args 記錄請求中的查詢參數 MultiDict
cookies 記錄請求中的cookie信息 Dict
headers 記錄請求中的報文頭 EnvironHeaders
method 記錄請求使用的HTTP方法 GET/POST
url 記錄請求的URL地址 string
files 記錄請求上傳的文件 *

案例:

# 訪問127.0.0.1:5000/?name=yd,獲取name值
from flask import request

app = Flask(__name__)

@app.route("/")
def index():
    name = request.args.get("name")
    return "請求參數:{}".format(name)

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

#上傳圖片

from flask import Flast, request

 
         

app = Flask(__name__)

 
         

@app.route("/img", methods=["POST"])
def up_load():
image = request.file.get("image")
image.save("./new_image.jpg")

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

# 注釋
1. 客戶端發圖片是post請求,而Flask默認是GET請求,所以我們需要指明請求方式是POST
2. 通過request.file.get("image")獲取到前端上傳的文件,我們直接用image接受,image此時是一個對象,我們可以直接用image.save()方法保存。保存時需要指定存儲路徑和文件名。

 
        

3. 注意坑:

  • args:查詢字符串,當多個同名參數Flask取第一個,django取最后一個。

  • method:get請求方式也能提交form表單


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM