Flask 使用 request 處理GET POST請求、上傳文件

  • 2019 年 11 月 14 日
  • 筆記

在Django框架開發中,request對象就是用來處理GETPOST請求的關鍵對象,而Flask框架也是一樣的。

下面來看看request對象的常用方法。

request對象的常用方法

request對象的導入:

from flask import request

Flask 框架中的 request 對象保存了一次HTTP請求的一切資訊。那麼這個HTTP請求中可能會是GETPOST請求,以及還要考慮如何獲取各種請求體或者URL參數。

而對應著這些參數的獲取或者GET/POST方法的區分,下面都有對應的常用方法來進行對應的處理。

常用的方法如下:

  • 如果是json格式的請求數據,則是採用request.data來獲取請求體的字元串。
  • 如果是form表單的請求體,那麼則可以使用request.form來獲取參數。
  • 如果是url參數,例如:url?param1=xx&param2=xx,那麼則可以使用request.args來獲取參數。
  • 如果需要區分GETPOST請求方法,則可以使用request.method來進行判斷區分。
  • 如果需要接收上傳的文件,則可以使用request.files來獲取上傳的文件資訊。

下面來看看示例方法。

Json請求: 使用 request.data 獲取請求體

處理視圖函數如下:

from flask import Flask, current_app, redirect, url_for, request  import json    # 實例化app  app = Flask(import_name=__name__)    # 通過methods設置POST請求  @app.route('/json', methods=["POST"])  def json_request():        # 接收處理json數據請求      data = json.loads(request.data) # 將json字元串轉為dict      user_name = data['user_name']      user_age = data['user_age']        return "user_name = %s, user_age = %s" % (user_name,user_age)    if __name__ == '__main__':      app.run(debug=True)

使用postman模擬請求如下:

form表單請求:request.form 獲取請求參數

在flask中獲取這個form的請求參數示例如下:

from flask import Flask, current_app, redirect, url_for, request    # 實例化app  app = Flask(import_name=__name__)    # 通過methods設置POST請求  @app.route('/form', methods=["POST"])  def form_request():        # 接收post請求的form表單參數      user_name = request.form.get('user_name')      user_age = request.form.get('user_age')        return "user_name = %s, user_age = %s" % (user_name,user_age)    if __name__ == '__main__':      app.run(debug=True)

一般form表單的請求都是使用post請求,下面可以使用postman來進行請求模擬,如下:

還有 form x-www-form-urlencoded 請求,如下:

上面form-data是可以包含文件類型的form表單,而x-www-form-urlencoded只是單純 key - value的數據。

而處理的業務程式碼是跟上面的一樣的。

form 表單請求中存在同一個參數名多個值的情況

這種請求下可以使用request.form.getlist() 來獲取同名多個參數,如下:

# 通過methods設置POST請求  @app.route('/form', methods=["POST"])  def form_request():        # 接收post請求的form表單參數      user_name = request.form.get('user_name')      user_age = request.form.get('user_age')        user_name_list = request.form.getlist('user_name')      print(user_name_list)        return "user_name = %s, user_age = %s, user_name_list = %s" % (user_name,user_age, user_name_list)

使用postman請求如下:

URL請求參數: request.args

在對於url上的?user_name=libai&user_age=17 該類的參數,則是使用request.args來獲取。 示例程式碼如下:

# 通過methods設置GET請求  @app.route('/args', methods=["GET"])  def args_request():        # 接收處理GET數據請求      user_name = request.args.get('user_name')      user_age = request.args.get('user_age')        print("user_name = %s, user_age = %s" % (user_name,user_age))        return "user_name = %s, user_age = %s" % (user_name,user_age)

使用postman模擬GET請求如下:

上傳文件請求:request.files

from flask import Flask, request    # 實例化app  app = Flask(import_name=__name__)    # 通過methods設置POST請求  @app.route('/upload_file', methods=["POST"])  def upload_file():        # 接收post請求上傳的文件      file = request.files.get('file')        if file is None:          # 表示沒有發送文件          return "未上傳文件"        # 直接使用上傳的文件對象保存      file.save("file.jpg")        return "上傳文件成功!"    if __name__ == '__main__':      app.run(debug=True)

使用postman上傳文件如下: