一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 90行Python代碼開發個人云盤應用

90行Python代碼開發個人云盤應用

2021-10-14 11:23費弗里 Python

這篇文章主要介紹了90行Python代碼開發個人云盤應用,幫助大家更好的理解和學習python,感興趣的朋友可以了解下

本文示例代碼已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

在今天的教程中,我們將介紹如何在Dash中高效地開發web應用中非常重要的「文件上傳」及「下載」功能。

2 在Dash中實現文件上傳與下載

2.1 在Dash中配合dash-uploader實現文件上傳

其實在自帶的dash_core_components中就封裝了基于html5原生API的dcc.Upload()組件,可以實現簡單的文件上傳功能,但說實話,非常的「不好用」,其主要缺點有:

  • 「文件大小有限制,150M到200M左右即出現瓶頸」
  • 「策略是先將用戶上傳的文件存放在瀏覽器內存,再通過base64形式傳遞到服務端再次解碼,非常低效」
  • 「整個上傳過程無法配合準確的進度條」

正是因為Dash自帶的上傳部件如此不堪,所以一些優秀的第三方拓展涌現出來,其中最好用的要數dash-uploader,它解決了上面提到的dcc.Upload()的所有短板。通過pip install dash-uploader進行安裝之后,就可以直接在Dash應用中使用了。

我們先從極簡的一個例子出發,看一看在Dash中使用dash-uploader的正確姿勢:

app1.py

 import dash import dash_uploader as du import dash_bootstrap_components as dbc import dash_html_components as html app = dash.Dash(__name__) # 配置上傳文件夾 du.configure_upload(app, folder='temp') app.layout = html.Div(     dbc.Container(         du.Upload()     ) ) if __name__ == '__main__':     app.run_server(debug=True)

90行Python代碼開發個人云盤應用

可以看到,僅僅十幾行代碼,我們就配合dash-uploader實現了簡單的文件上傳功能,其中涉及到dash-uploader兩個必不可少的部分:

2.1.1 利用du.configure_upload()進行配置

要在Dash中正常使用dash-uploader,我們首先需要利用du.configure_upload()進行相關配置,其主要參數有:

「app」,即對應已經實例化的Dash對象;

「folder」,用于設置上傳的文件所保存的根目錄,可以是相對路徑,也可以是絕對路徑;

「use_upload_id」,bool型,默認為True,這時被用戶上傳的文件不會直接置于「folder」參數指定目錄,而是會存放于du.Upload()部件的upload_id對應的子文件夾之下;設置為False時則會直接存放在根目錄,當然沒有特殊需求還是不要設置為False。

通過du.configure_upload()我們就完成了基本的配置。

2.1.2 利用du.Upload()創建上傳部件

接下來我們就可以使用到du.Upload()來創建在瀏覽器中渲染供用戶使用的上傳部件了,它跟常規的Dash部件一樣具有「id」參數,也有一些其他的豐富的參數供開發者充分自由地自定義功能和樣式:

「text」,字符型,用于設置上傳部件內顯示的文字;

「text_completed」,字符型,用于設置上傳完成后顯示的文字內容前綴;

「cancel_button」,bool型,用于設置是否在上傳過程中顯示“取消”按鈕;

「pause_button」,bool型,用于設置是否在上傳過程中顯示“暫停”按鈕;

「filetypes」,用于限制用戶上傳文件的格式范圍,譬如['zip', 'rar', '7zp']就限制用戶只能上傳這三種格式的文件。默認為None即無限制;

「max_file_size」,int型,單位MB,用于限制單次上傳的大小上限,默認為1024即1GB;

「default_style」,類似常規Dash部件的style參數,用于傳入css鍵值對,對部件的樣式進行自定義;

「upload_id」,用于設置部件的唯一id信息作為du.configure_upload()中所設置的緩存根目錄的下級子目錄,用于存放上傳的文件,默認為None,會在Dash應用啟動時自動生成一個隨機值;

「max_files」,int型,用于設置一次上傳最多可包含的文件數量,默認為1,也推薦設置為1,因為目前對于多文件上傳仍有「進度條異?!?、「上傳結束顯示異?!沟萣ug,所以不推薦設置大于1。

知曉了這些參數的作用之后,我們就可以創建出更符合自己需求的上傳部件:

app2.py

 import dash import dash_uploader as du import dash_bootstrap_components as dbc import dash_html_components as html app = dash.Dash(__name__) # 配置上傳文件夾 du.configure_upload(app, folder='temp') app.layout = html.Div(     dbc.Container(         du.Upload(             id='uploader',             text='點擊或拖動文件到此進行上傳!',             text_completed='已完成上傳文件:',             cancel_button=True,             pause_button=True,             filetypes=['md', 'mp4'],             default_style={                 'background-color': '#fafafa',                 'font-weight': 'bold'             },             upload_id='我的上傳'         )     ) ) if __name__ == '__main__':     app.run_server(debug=True)

90行Python代碼開發個人云盤應用

但像前面的例子那樣直接在定義app.layout時就傳入實際的du.Upload()部件,會產生一個問題――應用啟動后,任何訪問應用的用戶都對應一樣的upload_id,這顯然不是我們期望的,因為不同用戶的上傳文件會混在一起。

因此可以參考下面例子的方式,在每位用戶訪問時再渲染隨機id的上傳部件,從而確保唯一性:

app3.py

 import dash import dash_uploader as du import dash_bootstrap_components as dbc import dash_html_components as html import uuid app = dash.Dash(__name__) # 配置上傳文件夾 du.configure_upload(app, folder='temp') def render_random_id_uploader():     return du.Upload(             id='uploader',             text='點擊或拖動文件到此進行上傳!',             text_completed='已完成上傳文件:',             cancel_button=True,             pause_button=True,             filetypes=['md', 'mp4'],             default_style={                 'background-color': '#fafafa',                 'font-weight': 'bold'             },             upload_id=uuid.uuid1()         ) def render_layout():     return html.Div(     dbc.Container(         render_random_id_uploader()     ) ) app.layout = render_layout if __name__ == '__main__':     app.run_server(debug=True)

可以看到,每次訪問時由于upload_id不同,因此不同的會話擁有了不同的子目錄。

90行Python代碼開發個人云盤應用

2.1.3 配合du.Upload()進行回調

在du.Upload()中額外還有isCompleted與fileNames兩個屬性,前者用于判斷當前文件是否上傳完成,后者則對應此次上傳的文件名稱,參考下面這個簡單的例子:

app4.py

 import dash import dash_uploader as du import dash_bootstrap_components as dbc import dash_html_components as html from dash.dependencies import Input, Output, State app = dash.Dash(__name__) # 配置上傳文件夾 du.configure_upload(app, folder='temp') app.layout = html.Div(     dbc.Container(         [             du.Upload(id='uploader'),             html.H5('上傳中或還未上傳文件!', id='upload_status')         ]     ) ) @app.callback(     Output('upload_status', 'children'),     Input('uploader', 'isCompleted'),     State('uploader', 'fileNames') ) def show_upload_status(isCompleted, fileNames):     if isCompleted:         return '已完成上傳:'+fileNames[0]     return dash.no_update if __name__ == '__main__':     app.run_server(debug=True, port=8051)

90行Python代碼開發個人云盤應用

2.2 配合flask進行文件下載

相較于文件上傳,在Dash中進行文件的下載就簡單得多,因為我們可以配合flask的send_from_directory以及html.A()部件來為指定的服務器端文件創建下載鏈接,譬如下面的簡單示例就打通了文件的上傳與下載:

app5.py

 from flask import send_from_directory import dash import dash_uploader as du import dash_html_components as html import dash_bootstrap_components as dbc from dash.dependencies import Input, Output import os app = dash.Dash(__name__) du.configure_upload(app, 'temp', use_upload_id=False) app.layout = html.Div(     dbc.Container(         [             du.Upload(id='upload'),             html.Div(                 id='download-files'             )         ]     ) ) @app.server.route('/download/') def download(file):     return send_from_directory('temp', file) @app.callback(     Output('download-files', 'children'),     Input('upload', 'isCompleted') ) def render_download_url(isCompleted):     if isCompleted:         return html.Ul(             [                 html.Li(html.A(f'/{file}', href=f'/download/{file}', target='_blank'))                 for file in os.listdir('temp')             ]         )     return dash.no_update if __name__ == '__main__':     app.run_server(debug=True)

90行Python代碼開發個人云盤應用

3 用Dash編寫簡易個人網盤應用

在學習了今天的案例之后,我們就掌握了如何在Dash中開發文件上傳及下載功能,下面我們按照慣例,結合今天的主要內容,來編寫一個實際的案例;

今天我們要編寫的是一個簡單的個人網盤應用,我們可以通過瀏覽器訪問它,進行文件的上傳、下載以及刪除:

90行Python代碼開發個人云盤應用

 import dash import dash_bootstrap_components as dbc import dash_html_components as html from dash.dependencies import Input, Output, State import dash_uploader as du import os from flask import send_from_directory import time app = dash.Dash(__name__, suppress_callback_exceptions=True) du.configure_upload(app, 'NetDisk', use_upload_id=False) app.layout = html.Div(     dbc.Container(         [             html.H3('簡易的個人云盤應用'),             html.Hr(),             html.P('文件上傳區:'),             du.Upload(id='upload',                       text='點擊或拖動文件到此進行上傳!',                       text_completed='已完成上傳文件:',                       max_files=1000),             html.Hr(),             dbc.Row(                 [                     dbc.Button('刪除選中的文件', id='delete-btn', outline=True),                     dbc.Button('打包下載選中的文件', id='download-btn', outline=True)                 ]             ),             html.Hr(),             dbc.Spinner(                 dbc.Checklist(                     id='file-list-check'                 )             ),             html.A(id='download-url', target='_blank')         ]     ) ) @app.server.route('/download/') def download(file):     return send_from_directory('NetDisk', file) @app.callback(     [Output('file-list-check', 'options'),      Output('download-url', 'children'),      Output('download-url', 'href')],     [Input('upload', 'isCompleted'),      Input('delete-btn', 'n_clicks'),      Input('download-btn', 'n_clicks')],     State('file-list-check', 'value') ) def render_file_list(isCompleted, delete_n_clicks, download_n_clicks, check_value):     # 獲取上下文信息     ctx = dash.callback_context     if ctx.triggered[0]['prop_id'] == 'delete-btn.n_clicks':         for file in check_value:             try:                 os.remove(os.path.join('NetDisk', file))             except FileNotFoundError:                 pass     if ctx.triggered[0]['prop_id'] == 'download-btn.n_clicks':         import zipfile         with zipfile.ZipFile('NetDisk/打包下載.zip', 'w') as zipobj:             for file in check_value:                 try:                     zipobj.write(os.path.join('NetDisk', file))                 except FileNotFoundError:                     pass         return [                    {'label': file, 'value': file}                    for file in os.listdir('NetDisk')                    if file != '打包下載.zip'                ], '打包下載鏈接', '/download/打包下載.zip'     time.sleep(2)     return [                {'label': file, 'value': file}                for file in os.listdir('NetDisk')                if file != '打包下載.zip'            ], '', '' if __name__ == '__main__':     app.run_server(debug=True)

以上就是90行Python代碼開發個人云盤應用的詳細內容,更多關于python 開發個人云盤的資料請關注服務器之家其它相關文章!

原文鏈接:https://mp.weixin.qq.com/s/wYs7MvtM6gBzSMpprc_NbQ

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美多gayxxxx| 青草视频免费观看在线观看 | 欧美一级专区免费大片俄罗斯 | 五月天视频网 | 99久久精品免费精品国产 | 亚洲精品久久久久AV无码 | 青草免费在线观看 | 精品国产香蕉 | 高h全肉动漫在线观看免费 高h辣h双处全是肉军婚 | 久久热国产在线视频 | 无限时间看片在线观看 | 免费国产一级 | 国产一级在线观看视频 | 亚洲精品青青草原avav久久qv | 亚洲精品有码在线观看 | 国产精品久久久久久久久久久久久久 | 国产亚洲一欧美一区二区三区 | 色综合网亚洲精品久久 | 国产午夜免费视频 | 日韩在线视频免费观看 | 国产精品久久久久久福利 | julianann办公室| 四虎4hu永久免费国产精品 | 日韩欧美不卡视频 | 日本中文字幕在线精品 | 欧美精品久久一区二区三区 | 国产大神91一区二区三区 | 久久综合给合久久狠狠狠… | gogort99人体专业网站 | 欧美一级片免费 | 国产一级精品高清一级毛片 | 春意午夜影院 | 视频一本大道香蕉久在线播放 | 97精品久久天干天天蜜 | 91制片厂(果冻传媒)原档破解 | 交换余生在线播放免费 | 国产实拍会所女技师在线 | 免费91麻豆精品国产自产在线观看 | 久久re亚洲在线视频 | 欧美va在线播放免费观看 | 国产麻豆在线观看网站 |