pyhton Sanic框架的文件上傳功能開發(fā)實(shí)戰(zhàn)示例教程
Sanic框架的文件上傳
Sanic是一個(gè)Python 3.5+的異步Web框架,它的設(shè)計(jì)理念與Flask相似,但采用了更高效的異步I/O處理。在處理文件上傳時(shí),Sanic同樣提供了方便、高效的方法。本教程將結(jié)合實(shí)際案例,詳細(xì)介紹如何在Sanic框架中實(shí)現(xiàn)文件上傳的功能。
環(huán)境準(zhǔn)備
在開始之前,請(qǐng)確保你已經(jīng)安裝了Python 3.5或更高版本,并安裝了Sanic框架。如果沒(méi)有安裝Sanic,可以通過(guò)pip命令進(jìn)行安裝:
pip install sanic
基本概念
在Sanic中,文件上傳通常是通過(guò)request.files
屬性來(lái)實(shí)現(xiàn)的。當(dāng)客戶端以multipart/form-data
的方式發(fā)送POST請(qǐng)求時(shí),可以通過(guò)request.files.get('filename')
來(lái)獲取指定的文件對(duì)象。
文件上傳示例
1. 創(chuàng)建Sanic應(yīng)用
首先,我們需要?jiǎng)?chuàng)建一個(gè)Sanic應(yīng)用實(shí)例,并定義一個(gè)用于文件上傳的路由。
首先創(chuàng)建個(gè)文件上傳的目錄
代碼展示:
from sanic import Sanic from sanic.response import json app = Sanic("File-Upload-Example") @app.route("/upload", methods=["POST"]) async def handle_upload(request): # 獲取上傳的文件,根據(jù)請(qǐng)求體中file字段獲取上傳的文件 #先打印file對(duì)象 print("files對(duì)象",request.files) file = request.files.get('file') # print("獲取的文件對(duì)象名",file.name) print("查看file有哪些方法",dir(file)) if file: # 對(duì)文件進(jìn)行處理,這里簡(jiǎn)單地將文件保存到本地 file_path = './uploads/' + file.name with open(file_path, 'wb') as f: #上傳的文件在file的body中 f.write(file.body) return json({"message": "File uploaded successfully", "filename": file.name}) else: return json({"error": "No file uploaded"}, status=400) if __name__ == "__main__": app.run(host="0.0.0.0", port=8000)
2. 客戶端上傳文件
為了測(cè)試文件上傳功能,我們需要一個(gè)客戶端來(lái)發(fā)送文件。可以使用Postman這樣的工具,或者使用Python的requests
庫(kù)來(lái)發(fā)送請(qǐng)求。
- 使用Postman 打開Postman,創(chuàng)建一個(gè)新的POST請(qǐng)求。
- 在請(qǐng)求URL中輸入
http://localhost:8000/upload
。 - 設(shè)置Headers中的
Content-Type
為multipart/form-data
。 - 在Body中選擇
form-data
,然后點(diǎn)擊Add file
選擇你要上傳的文件。 - 然后在Value處點(diǎn)擊Search Files選擇需要上傳的文件。
- 發(fā)送請(qǐng)求,并查看響應(yīng)。
在body處選擇 form-data類型請(qǐng)求,創(chuàng)建個(gè)key為file的鍵值對(duì)。
點(diǎn)擊Search Files選擇需要上傳的文件
選擇文件
點(diǎn)擊發(fā)送請(qǐng)求
上傳成功
使用Python requests庫(kù)
我們現(xiàn)在桌面創(chuàng)建個(gè)txt文檔
import requests url = 'http://localhost:8000/upload' files = {'file': open(r'C:\Users\dell\Desktop\text.txt', 'rb')} response = requests.post(url, files=files) print(response.text)
上傳成功
文件上傳的進(jìn)階用法
3. 驗(yàn)證上傳文件的類型
為了防止用戶上傳不安全的文件類型(如可執(zhí)行文件、腳本文件等),你需要在服務(wù)器端驗(yàn)證上傳文件的MIME類型或文件擴(kuò)展名。
from sanic import HTTPResponse, request, json @app.route("/upload", methods=["POST"]) async def handle_upload(request): file = request.files.get("file") if not file: return json({"error": "沒(méi)有文件被上傳"}, status=400) # 檢查文件類型 allowed_types = {"image/jpeg", "image/png", "application/pdf"} if file.type not in allowed_types: return json({"error": "不允許的文件類型"}, status=400) # 保存文件(這里省略了具體的保存邏輯) return json({"message": "文件上傳成功"})
在這個(gè)例子中,我們檢查了上傳文件的type
屬性,它通常包含了文件的MIME類型。我們定義了一個(gè)allowed_types
集合,包含了允許上傳的文件類型。如果上傳的文件類型不在這個(gè)集合中,我們就返回一個(gè)錯(cuò)誤響應(yīng)。
4. 安全性考慮
- 防止目錄遍歷:確保在保存上傳文件時(shí),不要直接使用用戶輸入的文件名或路徑,以防止目錄遍歷攻擊。可以使用哈希函數(shù)或UUID來(lái)生成唯一的文件名。
- 限制上傳目錄的權(quán)限:確保上傳目錄的權(quán)限設(shè)置得當(dāng),以防止未授權(quán)訪問(wèn)或執(zhí)行上傳的文件。
- 使用HTTPS:在生產(chǎn)環(huán)境中,始終使用HTTPS來(lái)保護(hù)用戶數(shù)據(jù)和文件傳輸?shù)陌踩浴?/li>
5. 進(jìn)度反饋
對(duì)于大文件上傳,用戶可能會(huì)希望看到上傳進(jìn)度。然而,Sanic本身并不直接支持上傳進(jìn)度的跟蹤。但是,你可以通過(guò)前端JavaScript(如使用XMLHttpRequest或Fetch API的upload
事件)來(lái)跟蹤上傳進(jìn)度,并通過(guò)WebSocket、Server-Sent Events (SSE) 或輪詢等方式將進(jìn)度信息發(fā)送到服務(wù)器,然后服務(wù)器可以將這些信息廣播給需要它們的客戶端。
6. 異步文件處理
如果你需要在文件上傳后執(zhí)行一些耗時(shí)的處理(如圖像分析、視頻轉(zhuǎn)碼等),并且這些處理不需要立即返回結(jié)果給用戶,你可以將這些處理任務(wù)放入后臺(tái)執(zhí)行。這可以通過(guò)將任務(wù)提交到消息隊(duì)列(如RabbitMQ、Kafka)或使用后臺(tái)工作進(jìn)程(如Celery)來(lái)實(shí)現(xiàn)。
7. 監(jiān)控和日志
對(duì)于生產(chǎn)環(huán)境中的應(yīng)用,監(jiān)控和日志記錄是非常重要的。你可以使用Sanic的日志系統(tǒng)來(lái)記錄關(guān)鍵事件和錯(cuò)誤,并使用如Prometheus、Grafana等工具來(lái)監(jiān)控應(yīng)用的性能。
總結(jié)
在使用Sanic進(jìn)行文件上傳時(shí),除了處理文件本身之外,還需要考慮安全性、性能、用戶體驗(yàn)等多個(gè)方面。通過(guò)驗(yàn)證文件類型、限制文件大小、使用異步IO、提供進(jìn)度反饋以及實(shí)施適當(dāng)?shù)谋O(jiān)控和日志記錄,你可以構(gòu)建出既安全又高效的文件上傳功能。
到此這篇關(guān)于pyhton Sanic框架的文件上傳功能開發(fā)實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)pyhton Sanic文件上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將Django項(xiàng)目遷移到linux系統(tǒng)的詳細(xì)步驟
這篇文章主要介紹了將Django項(xiàng)目遷移到linux系統(tǒng)的詳細(xì)步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03python使用celery實(shí)現(xiàn)異步任務(wù)執(zhí)行的例子
今天小編就為大家分享一篇python使用celery實(shí)現(xiàn)異步任務(wù)執(zhí)行的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08python實(shí)現(xiàn)定時(shí)任務(wù)的八種方式總結(jié)
在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),下面這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)定時(shí)任務(wù)的八種方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01對(duì)python中 math模塊下 atan 和 atan2的區(qū)別詳解
今天小編就為大家分享一篇對(duì)python中 math模塊下 atan 和 atan2的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Python中執(zhí)行存儲(chǔ)過(guò)程及獲取存儲(chǔ)過(guò)程返回值的方法
這篇文章主要介紹了Python中執(zhí)行存儲(chǔ)過(guò)程及獲取存儲(chǔ)過(guò)程返回值的方法,結(jié)合實(shí)例形式總結(jié)分析了Python調(diào)用存儲(chǔ)過(guò)程的常用方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-10-10Python利用代碼計(jì)算2個(gè)坐標(biāo)之間的距離
這篇文章主要介紹了Python利用代碼計(jì)算2個(gè)坐標(biāo)之間的距離,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08對(duì)Python 文件夾遍歷和文件查找的實(shí)例講解
下面小編就為大家分享一篇對(duì)Python 文件夾遍歷和文件查找的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04在Python中處理時(shí)間之clock()方法的使用
這篇文章主要介紹了在Python中處理時(shí)間之clock()方法的使用,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05