在 Flask 裡面導入 request
套件包
from flask import request
通過前面提過的 method 屬性可以操作當前的請求方法
藉由 form 屬性處理POST
或是PUT
方法傳來的表單資料
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
# the code below is executed if the request method
# was GET or the credentials were invalid
return render_template('login.html', error=error)
如果傳入的 form 屬性中不存在指定的鍵值時會發生什麼事情呢?會引發 KeyError
如果沒有捕捉這個 KeyError 錯誤,則會顯示一個 HTTP 400 Bad Request 的錯誤頁面
要操作 URL 中提交的參數,例如:?key=value
。可以使用「args」屬性
from flask import request
@app.route('/banana/')
def banana():
return request.args.get('key', 'defult value')
因為使用者可能會透過改變網址而造成指定鍵值不存在
這時候建議通過捕捉 KeyError 或是利用判斷式:
from flask import request
@app.route('/banana/')
def banana():
searchword = request.args.get('key')
if searchword:
return searchword
else:
return 'nothing'
或是設定 request.args.get 方法預設值的方式來解決這個問題:
from flask import request
@app.route('/banana/')
def banana():
searchword = request.args.get('key', 'hey Moona')
return searchword
只要在 HTML 表單中設定enctype="multipart/form-data"
屬性,瀏覽器就會傳送檔案了
上傳的文件會被儲存在記憶體或是檔案系統中的臨時位置,可以透過file
屬性來取得上傳的檔案
每個上傳的文件會被存在這個 Dictionary 屬性中,這個屬性基本上和 Python 原生的file
物件一樣
只是額外多了一個save()
方法,可以讓你把上傳的檔案存到伺服器的檔案系統中
from flask import request
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/uploaded_file.txt')
...
如果想取得檔案在使用者端上傳時候的檔名,可以使用 filename 屬性
但是這個值視可以被偽造的!,所以永遠不要信任這個值
如果真的想要把使用者端的檔名作為伺服器上的檔案名稱
可以通過Werkzeug
提供的 secure_filename() 函數
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
file = request.files['the_file']
file.save(f"/var/www/uploads/{secure_filename(f.filename)}")
...
更多關於檔案上傳的說明可以參考:上傳文件