引用request的方法:
from flask import request
與Django不同的是,flask是不需要將request對象作為第一個參數傳入視圖函數,他的request
對象是來自於flask,是一個請求上下文
對象(全局變量 --> 線程局部變量,使用起來就像線程全局變量一樣,具有較高的隔離性
),我們只需導入即可使用,request對象中保存了一次HTTP請求的一切信息。
request常用屬性如下:
可以在 base_request.py 包的 BaseRequest 類中查看所有屬性。
data屬性
用於獲取請求中的參數
# 獲取請求中的參數 @app.route("/data/", methods=["POST"]) def request_data(): data = request.data print(type(data)) # <class 'bytes'> return F"{data}"
form屬性
用於獲取請求中的表單參數
# 獲取請求的表單參數 @app.route("/form/", methods=["POST"]) def request_form(): form = request.form print(type(form)) # <class 'werkzeug.datastructures.ImmutableMultiDict'> print(form) # ImmutableMultiDict([('name', 'lisi'), ('age', '11')]) name = form.get("name") age = form.get("age") return F"{name},{age}"
args屬性
用於獲取請求中的URL中的參數
# 獲取請求URL中的參數 @app.route("/args/") def request_args(): args = request.args print(type(args)) # <class 'werkzeug.datastructures.ImmutableMultiDict'> print(args) # ImmutableMultiDict([('name', 'wangwu'), ('age', '12')]) name = args.get("name") age = args.get("age") return F"{name},{age}"
cookies屬性
用於獲取請求中的cookies參數
# 獲取請求中的cookies信息 @app.route("/cookies/") def request_cookies(): cookies = request.cookies print(type(cookies)) # <class 'werkzeug.datastructures.ImmutableMultiDict'> print(cookies) # ImmutableMultiDict([('cookie_name', 'zhaoliu')]) cookie_name = cookies.get("cookie_name") return F"cookies:{cookie_name}"
headers屬性
用於獲取請求中的頭部信息
# 獲取請求中的headers信息 @app.route("/headers/") def request_headers(): headers = request.headers print(type(headers)) # <class 'werkzeug.datastructures.EnvironHeaders'> print(headers) """ Headers-Name: luqi # 自定義的頭部 Cache-Control: no-cache Postman-Token: bb38af34-f18a-40f0-b974-a0af8d6e1389 User-Agent: PostmanRuntime/7.6.1 Accept: */* Host: 127.0.0.1:5000 Cookie: cookie_name=zhaoliu Accept-Encoding: gzip, deflate Connection: keep-alive """ headers_name = headers.get("Headers-Name") return F"{headers_name}"
method屬性
用於獲取請求的方式
# 獲取請求的請求方式 @app.route("/method/") def request_method(): method = request.method print(type(method)) # <class 'str'> print(method) # GET return method
url屬性
用於獲取請求的鏈接
# 獲取請求中的url信息 @app.route("/url/") def request_url(): url = request.url print(type(url)) # <class 'str'> print(url) # http://127.0.0.1:5000/url/ return url
files屬性
from werkzeug.utils import secure_filename # 文件上傳 # 限制文件大小為16M,如果超過16M,Flask 會拋出一個 RequestEntityTooLarge 異常 app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 @app.route("/files/", methods=["POST"]) def request_files(): files = request.files print(type(files)) # <class 'werkzeug.datastructures.ImmutableMultiDict'> print(files) # ImmutableMultiDict([('filename', <FileStorage: '1.jpg' ('image/jpeg')>)]) # 獲取文件對象 file = files.get("file") # <FileStorage: '1.jpg' ('image/jpeg')> if file is None: return "未上傳文件" # 獲取文件的名字 filename = file.filename # 1.jpg # 解決文件名偽造問題 filename = secure_filename(filename) # 將文件保存到本地 # 1、使用python的open方法 # with open("./" + filename, "wb") as f: # # 讀取上傳的文件 # file_content = file.read() # # 寫入到本地文件 # f.write(file_content) # 2、使用flask封裝的save方法 file.save("./" + filename) return "上傳成功"
上面代碼中,我們使用 Werkzeug
提供的 secure_filename()
函數來解決文件名偽造的問題:
filename = secure_filename(filename)
試想一下,如果我們不這樣處理,假如有人惡意仿造文件名,把下面的信息作為 filename 傳遞給你的應用:
filename = "../../../../home/username/.bashrc"
假設 ../
的個數是正確的,那么用戶就有可能修改服務器上的文件。
通過交互模式,我們看看 secure_filename() 函數的處理機制:
附碼:
from flask import Flask, request from werkzeug.utils import secure_filename app = Flask(__name__) # 獲取請求的參數 @app.route("/data/", methods=["POST"]) def request_data(): data = request.data print(type(data)) # <class 'bytes'> return F"{data}" # 獲取請求的表單參數 @app.route("/form/", methods=["POST"]) def request_form(): form = request.form print(type(form)) # <class 'werkzeug.datastructures.ImmutableMultiDict'> print(form) # ImmutableMultiDict([('name', 'lisi'), ('age', '11')]) name = form.get("name") age = form.get("age") return F"{name},{age}" # 獲取請求URL中的參數 @app.route("/args/") def request_args(): args = request.args print(type(args)) # <class 'werkzeug.datastructures.ImmutableMultiDict'> print(args) # ImmutableMultiDict([('name', 'wangwu'), ('age', '12')]) name = args.get("name") age = args.get("age") return F"{name},{age}" # 獲取請求中的cookies信息 @app.route("/cookies/") def request_cookies(): cookies = request.cookies print(type(cookies)) # <class 'werkzeug.datastructures.ImmutableMultiDict'> print(cookies) # ImmutableMultiDict([('cookie_name', 'zhaoliu')]) cookie_name = cookies.get("cookie_name") return F"cookies:{cookie_name}" # 獲取請求中的headers信息 @app.route("/headers/") def request_headers(): headers = request.headers print(type(headers)) # <class 'werkzeug.datastructures.EnvironHeaders'> print(headers) """ Headers-Name: luqi # 自定義的頭部 Cache-Control: no-cache Postman-Token: bb38af34-f18a-40f0-b974-a0af8d6e1389 User-Agent: PostmanRuntime/7.6.1 Accept: */* Host: 127.0.0.1:5000 Cookie: cookie_name=zhaoliu Accept-Encoding: gzip, deflate Connection: keep-alive """ headers_name = headers.get("Headers-Name") return F"{headers_name}" # 獲取請求的請求方式 @app.route("/method/") def request_method(): method = request.method print(type(method)) # <class 'str'> print(method) # GET return method # 獲取請求中的url信息 @app.route("/url/") def request_url(): url = request.url print(type(url)) # <class 'str'> print(url) # http://127.0.0.1:5000/url/ return url # 文件上傳 # 限制文件大小為16M,如果超過16M,Flask 會拋出一個 RequestEntityTooLarge 異常 app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 @app.route("/files/", methods=["POST"]) def request_files(): files = request.files print(type(files)) # <class 'werkzeug.datastructures.ImmutableMultiDict'> print(files) # ImmutableMultiDict([('filename', <FileStorage: '1.jpg' ('image/jpeg')>)]) # 獲取文件對象 file = files.get("file") # <FileStorage: '1.jpg' ('image/jpeg')> if file is None: return "未上傳文件" # 獲取文件的名字 filename = file.filename # 1.jpg # 解決文件名偽造問題 filename = secure_filename(filename) # 將文件保存到本地 # 1、使用python的open方法 # with open("./" + filename, "wb") as f: # # 讀取上傳的文件 # file_content = file.read() # # 寫入到本地文件 # f.write(file_content) # 2、使用flask封裝的save方法 file.save("./" + filename) return "上傳成功" if __name__ == '__main__': app.run()
原文參考: https://blog.csdn.net/qq_42517220/article/details/88710861
BaseRequest