事情是這樣的。
有一天五號程序員打算網購一盒巧克力送給自己的女朋友
flask部署到服務器,
想必女朋友收到禮物是這樣的:
結果商家郵寄來的巧克力中夾著一張紙條:
害!你說氣不氣人,現在都還沒理我!
python flask 寫接口?
這不投訴更待何時?
打開投訴界面一看,咦?要求上傳圖片。
哈~既然說起上傳,那咱們就先說一下如何使用Flask上傳文件。
02html上傳文件python、使用Flask上傳文件的簡單實現
Flask文件上傳比較簡單,主要是下面3點:
一個標簽被標記有enctype= multipart/form-data ,并且在里面包含一個標簽
服務端應用通過請求對象上的files字典訪問文件
使用文件的save()方法將文件永久的保存在文件系統的某處
既然涉及到保存,那肯定會用到路徑。下面是os.path方法的相關屬性:
flask上傳下載大文件、os.path.sep:Windows下路徑分隔符,即反斜杠‘\’
os.path.altsep:Linux下路徑分隔符,即斜杠‘/‘
當前目錄:os.path.curdir
父目錄:os.path.pardir
絕對路徑:os.path.abspath(path)
有了這些基本知識就夠了,接下來直接實戰。新建app.py文件,內容如下:
from flask import Flask,render_template,requestfrom os import pathfrom werkzeug.utils import secure_filenameapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def index(): if request.method == 'GET': return render_template('upload.html') else: f = request.files['file'] filename = secure_filename(f.filename) f.save(path.join('D:/test', filename)) #文件的具體路徑根據個人而定,這里以D盤test文件夾為例 return "上傳文件成功!"if __name__ == "__main__": app.run(debug=True)
flask前后端交互,導入secure_filename方法是為了在傳入中文文件名時過濾掉中文名,只留下文件名后綴;path.join()則可以整合路徑。
在templates文件夾下新建upload.html文件,用于文件上傳:
<html lang="en"><head> <meta charset="UTF-8"> <title>文件上傳title><style type="text/css">.div1 { height:180px; width:380px; border:1px solid #8A8989; margin:0 auto;}.input { display: block; width:250px; height:30px; margin:10px auto;}.button { background: #2066C5; color:white; font-size:18px; font-weight: bold; height: 30px; border-radius: 4px;}style>head><body> <div class="div1"> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file" class="input"> <input type="submit" value="上傳" class="input button"> form>div>body>html>
運行文件后將能看見如下界面:
選擇指定的word文件:
flask web開發實戰?點擊上傳,顯示“上傳成功”:
由于在form標簽中action屬性沒有指定其他網頁,所以會跳轉到同一個網址,但此時的request.method已經由GET變為POST,所以執行else下的代碼。
看一下文件夾內有沒有:
成功!我們的電腦就像一個服務器,可以實現任意文件的上傳,但是以中文命名的文件上傳時會出現中文丟失。
03改進上傳功能flask框架。雖然上面的代碼實現了文件上傳功能,但還有一些不足:
文件沒有重新命名,多名用戶上傳同名文件如何處理?
沒有實現文件目錄自動創建,文件保存失敗怎么辦?
文件上傳時沒有進行文件格式檢驗,影響數據安全怎么設卡?
為了解決上述問題,新建form.py文件用于表單驗證:
from wtforms import Form,FileFieldfrom flask_wtf.file import FileRequired,FileAllowedclass UploadForm(Form): file = FileField(validators=[FileRequired(), FileAllowed(['jpg','png','gif'])])
其中,FileRequired()用來驗證文件上傳是否為空,FileAllowed()用來驗證上傳文件的后綴名。
bootstrap文件上傳。然后修改app.py文件:
from flask import Flask,render_template,request,send_from_directoryimport timeimport osfrom os import pathfrom werkzeug.utils import secure_filenamefrom werkzeug.datastructures import CombinedMultiDictimport platformfrom form import UploadFormapp = Flask(__name__)#判斷系統,使用不同分隔符if platform.system() == "Windows": slash = '\\'else: platform.system() == "Linux" slash = '/'UPLOAD_PATH = 'D:' + slash + 'uploads' + slash@app.route('/', methods=['GET', 'POST'])def index(): if request.method == 'GET': return render_template('upload.html') else: if not path.exists(UPLOAD_PATH): os.makedirs(UPLOAD_PATH) #路徑不存在時創建路徑 form = UploadForm(CombinedMultiDict([request.form, request.files])) if form.validate(): f = request.files['file'] filename = secure_filename(f.filename) ext = filename.rsplit('.', 1)[1] #獲取文件后綴 unix_time = int(time.time()) #獲取時間用于命名,不會重復 new_filename = str(unix_time) + '.' + ext f.save(path.join(UPLOAD_PATH, new_filename)) return "上傳文件成功!" else: "僅支持jpg、png和gif格式的文件!" @app.route('/images//', methods=['GET', 'POST'])def get_image(filename): return send_from_directory(UPLOAD_PATH, filename)if __name__ == "__main__": app.run(debug=True)
其中,os.makedirs()可以自動創建文件路徑,然后用CombinedMultiDict()?把form和file的數據結合起來一起驗證,用時間戳加文件后綴重新命名文件,最后新建get_image()視圖函數用于下載文件,send_from_directory(dirpath, filename)函數可以實現文件在線下載功能。
運行app.py,選擇在桌面上的“handsome.jpg”文件:
點擊上傳可以看到“文件上傳成功!”。找一下電腦中的源文件:
flask入門到實踐?可以看到在D盤下生成了uploads文件夾,接下來在瀏覽器訪問:http://127.0.0.1:5000/images/xxx.jpg/,根據保存時的文件名輸入網址實現在線下載功能。
如果上傳word文檔行不行呢?試一下:
不行!報錯!
因為上傳的文件只能是三種圖片格式!
04看到這里有些小伙伴可能會感到熟悉,是不是在哪里見過?
flask開發工具,沒錯,百度貼吧!
登錄百度美圖吧,隨機找到一張圖片并打開:
觀察其網址,再點開同一帖子下的圖片觀察其網址,你會發現其中的命名規則。
今天的內容圖比較多,看起來比較費勁,上傳文件的內容非常重要,需要小伙伴們多加練習才能掌握!
下一次,我們將談一談經常提到的Cookies。
flask開發、你確定不關注我一波?!
- END -版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态