flask部署到服務器,flask 接口上傳文件_Flask干貨:Flask數據交換——上傳文件

 2023-10-02 阅读 19 评论 0

摘要:圖 | 源網絡文 | 5號程序員01事情是這樣的。有一天五號程序員打算網購一盒巧克力送給自己的女朋友flask部署到服務器,想必女朋友收到禮物是這樣的:結果商家郵寄來的巧克力中夾著一張紙條:害!你說氣不氣人,現在都還沒理我!python flask 寫

c1d78d5b91cecd45651ac82805806e49.png

5aae64d619e55713845035e063a6b073.png

圖 | 源網絡文 | 5號程序員01

事情是這樣的。

131bb623c19707e01ea0efcb0a9a3d1f.png

有一天五號程序員打算網購一盒巧克力送給自己的女朋友

flask部署到服務器,bc39aa9095c3e03727e47e291d124d29.png

想必女朋友收到禮物是這樣的:

0be9e62429dfcfd7c22b7ddc7f058ed6.png

結果商家郵寄來的巧克力中夾著一張紙條:

1cea1aa58ee835c88058833ae1f8cdea.png

害!你說氣不氣人,現在都還沒理我!

python flask 寫接口?338df8abc70e16af056ac1884f9b140a.png

這不投訴更待何時?

8b48825ce0a0eed6244c50032d2677fd.png

打開投訴界面一看,咦?要求上傳圖片。

754fb36e0468fa452dbeb55d413a5aa9.png

哈~既然說起上傳,那咱們就先說一下如何使用Flask上傳文件。

02

html上傳文件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>

運行文件后將能看見如下界面:

3684a153fb7af2713a7df73a6e29334d.png

選擇指定的word文件:

eb96c46e0acabb6f6289b02817ff864f.png

flask web開發實戰?點擊上傳,顯示“上傳成功”:

f586f044bb197fed2f81493c1468413e.png

由于在form標簽中action屬性沒有指定其他網頁,所以會跳轉到同一個網址,但此時的request.method已經由GET變為POST,所以執行else下的代碼。

看一下文件夾內有沒有:

2c87153b6090e546183c7989e42ff536.png

成功!我們的電腦就像一個服務器,可以實現任意文件的上傳,但是以中文命名的文件上傳時會出現中文丟失

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”文件:

a43164a1361c9a7bf04d07ce5ac89918.png

點擊上傳可以看到“文件上傳成功!”。找一下電腦中的源文件:

25948df1b55e39f58c556b2df0a9a085.png

flask入門到實踐?可以看到在D盤下生成了uploads文件夾,接下來在瀏覽器訪問:http://127.0.0.1:5000/images/xxx.jpg/,根據保存時的文件名輸入網址實現在線下載功能

如果上傳word文檔行不行呢?試一下:

252ee28ede0b428f9a6ef28dcf4f711f.png

不行!報錯!

因為上傳的文件只能是三種圖片格式!

04

看到這里有些小伙伴可能會感到熟悉,是不是在哪里見過?

flask開發工具,沒錯,百度貼吧

登錄百度美圖吧,隨機找到一張圖片并打開:

6183a1746c95c6f228365c46a31e2c0d.png

觀察其網址,再點開同一帖子下的圖片觀察其網址,你會發現其中的命名規則

今天的內容圖比較多,看起來比較費勁,上傳文件的內容非常重要,需要小伙伴們多加練習才能掌握!

下一次,我們將談一談經常提到的Cookies

flask開發、你確定不關注我一波?!

373e69ad5be709b4298bb156c19234ad.png

- END -

543381d507414755e60b55b9bab4b0c3.png

09bb6eb6b6d6abb0a43161424ece8511.gif

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/110658.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息