iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
Software Development

都是 P 開頭的程式語言,你是在 py 啥啦系列 第 6

[06] [Flask 快速上手筆記] 05. 發送請求與文件上傳

  • 分享至 

  • xImage
  •  

在 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)}")
    ...

更多關於檔案上傳的說明可以參考:上傳文件


上一篇
[05] [Flask 快速上手筆記] 04. HTTP 方法x靜態文件x渲染模板
下一篇
[07] [Flask 快速上手筆記] 06. Cookie and Session
系列文
都是 P 開頭的程式語言,你是在 py 啥啦30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言