电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:3日期:2022-06-22 08:49:55

本文示例代碼已上傳至我的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 dashimport dash_uploader as duimport dash_bootstrap_components as dbcimport dash_html_components as htmlapp = 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,因為目前對于多文件上傳仍有「進度條異常」、「上傳結束顯示異常」等bug,所以不推薦設置大于1。

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

app2.py

import dashimport dash_uploader as duimport dash_bootstrap_components as dbcimport dash_html_components as htmlapp = 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 dashimport dash_uploader as duimport dash_bootstrap_components as dbcimport dash_html_components as htmlimport uuidapp = 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_layoutif __name__ == ’__main__’: app.run_server(debug=True)

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

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

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

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

app4.py

import dashimport dash_uploader as duimport dash_bootstrap_components as dbcimport dash_html_components as htmlfrom dash.dependencies import Input, Output, Stateapp = 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_updateif __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_directoryimport dashimport dash_uploader as duimport dash_html_components as htmlimport dash_bootstrap_components as dbcfrom dash.dependencies import Input, Outputimport osapp = 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/<file>’)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_updateif __name__ == ’__main__’: app.run_server(debug=True)

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

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

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

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

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

import dashimport dash_bootstrap_components as dbcimport dash_html_components as htmlfrom dash.dependencies import Input, Output, Stateimport dash_uploader as duimport osfrom flask import send_from_directoryimport timeapp = 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/<file>’)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 zipfilewith zipfile.ZipFile(’NetDisk/打包下載.zip’, ’w’) as zipobj: for file in check_value:try: zipobj.write(os.path.join(’NetDisk’, file))except FileNotFoundError: passreturn [ {’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 開發個人云盤的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 铸铁平台,大理石平台专业生产厂家_河北-北重机械 | 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 股票入门基础知识_股票知识_股票投资大师_格雷厄姆网 | 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 鑫达滑石-辽宁鑫达滑石集团| 衬氟止回阀_衬氟闸阀_衬氟三通球阀_衬四氟阀门_衬氟阀门厂-浙江利尔多阀门有限公司 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 烟台金蝶财务软件,烟台网站建设,烟台网络推广 | 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 蜜蜂职场文库_职场求职面试实用的范文资料大全 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | 颚式破碎机,圆锥破碎机,制砂机-新乡市德诚机电制造有限公司 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | VOC检测仪-甲醛检测仪-气体报警器-气体检测仪厂家-深恒安科技有限公司 | 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 动环监控_机房环境监控_DCIM_机房漏水检测-斯特纽 | 蔬菜配送公司|蔬菜配送中心|食材配送|饭堂配送|食堂配送-首宏公司 | 减速机三参数组合探头|TSM803|壁挂式氧化锆分析仪探头-安徽鹏宸电气有限公司 | 农业仪器网 - 中国自动化农业仪器信息交流平台 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 成都离婚律师|成都结婚律师|成都离婚财产分割律师|成都律师-成都离婚律师网 | 隧道风机_DWEX边墙风机_SDS射流风机-绍兴市上虞科瑞风机有限公司 | 富森高压水枪-柴油驱动-养殖场高压清洗机-山东龙腾环保科技有限公司 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 |