Python Sanic框架實現(xiàn)文件上傳功能
前言
Sanic是一個Python 3.5+的異步Web框架,它的設(shè)計理念與Flask相似,但采用了更高效的異步I/O處理。在處理文件上傳時,Sanic同樣提供了方便、高效的方法。本教程將結(jié)合實際案例,詳細(xì)介紹如何在Sanic框架中實現(xiàn)文件上傳的功能。
環(huán)境準(zhǔn)備
在開始之前,請確保你已經(jīng)安裝了Python 3.5或更高版本,并安裝了Sanic框架。如果沒有安裝Sanic,可以通過pip命令進(jìn)行安裝:
pip install sanic
基本概念
在Sanic中,文件上傳通常是通過request.files屬性來實現(xiàn)的。當(dāng)客戶端以multipart/form-data的方式發(fā)送POST請求時,可以通過request.files.get('filename')來獲取指定的文件對象。
文件上傳示例
1. 創(chuàng)建Sanic應(yīng)用
首先,我們需要創(chuàng)建一個Sanic應(yīng)用實例,并定義一個用于文件上傳的路由。
首先創(chuàng)建個文件上傳的目錄

代碼展示:
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ù)請求體中file字段獲取上傳的文件
#先打印file對象
print("files對象",request.files)
file = request.files.get('file')
# print("獲取的文件對象名",file.name)
print("查看file有哪些方法",dir(file))
if file:
# 對文件進(jì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. 客戶端上傳文件
為了測試文件上傳功能,我們需要一個客戶端來發(fā)送文件。可以使用Postman這樣的工具,或者使用Python的requests庫來發(fā)送請求。
使用Postman
- 打開Postman,創(chuàng)建一個新的POST請求。
- 在請求URL中輸入
http://localhost:8000/upload。 - 設(shè)置Headers中的
Content-Type為multipart/form-data。 - 在Body中選擇
form-data,然后點擊Add file選擇你要上傳的文件。 - 然后在Value處點擊Search Files選擇需要上傳的文件。
- 發(fā)送請求,并查看響應(yīng)。
在body處選擇 form-data類型請求,創(chuàng)建個key為file的鍵值對。

點擊Search Files選擇需要上傳的文件

選擇文件

點擊發(fā)送請求


上傳成功

使用Python requests庫
我們現(xiàn)在桌面創(chuàng)建個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. 驗證上傳文件的類型
為了防止用戶上傳不安全的文件類型(如可執(zhí)行文件、腳本文件等),你需要在服務(wù)器端驗證上傳文件的MIME類型或文件擴展名。
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": "沒有文件被上傳"}, 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": "文件上傳成功"})
在這個例子中,我們檢查了上傳文件的type屬性,它通常包含了文件的MIME類型。我們定義了一個allowed_types集合,包含了允許上傳的文件類型。如果上傳的文件類型不在這個集合中,我們就返回一個錯誤響應(yīng)。
4. 安全性考慮
- 防止目錄遍歷:確保在保存上傳文件時,不要直接使用用戶輸入的文件名或路徑,以防止目錄遍歷攻擊??梢允褂霉:瘮?shù)或UUID來生成唯一的文件名。
- 限制上傳目錄的權(quán)限:確保上傳目錄的權(quán)限設(shè)置得當(dāng),以防止未授權(quán)訪問或執(zhí)行上傳的文件。
- 使用HTTPS:在生產(chǎn)環(huán)境中,始終使用HTTPS來保護(hù)用戶數(shù)據(jù)和文件傳輸?shù)陌踩浴?/li>
5. 進(jìn)度反饋
對于大文件上傳,用戶可能會希望看到上傳進(jìn)度。然而,Sanic本身并不直接支持上傳進(jìn)度的跟蹤。但是,你可以通過前端JavaScript(如使用XMLHttpRequest或Fetch API的upload事件)來跟蹤上傳進(jìn)度,并通過WebSocket、Server-Sent Events (SSE) 或輪詢等方式將進(jìn)度信息發(fā)送到服務(wù)器,然后服務(wù)器可以將這些信息廣播給需要它們的客戶端。
6. 異步文件處理
如果你需要在文件上傳后執(zhí)行一些耗時的處理(如圖像分析、視頻轉(zhuǎn)碼等),并且這些處理不需要立即返回結(jié)果給用戶,你可以將這些處理任務(wù)放入后臺執(zhí)行。這可以通過將任務(wù)提交到消息隊列(如RabbitMQ、Kafka)或使用后臺工作進(jìn)程(如Celery)來實現(xiàn)。
7. 監(jiān)控和日志
對于生產(chǎn)環(huán)境中的應(yīng)用,監(jiān)控和日志記錄是非常重要的。你可以使用Sanic的日志系統(tǒng)來記錄關(guān)鍵事件和錯誤,并使用如Prometheus、Grafana等工具來監(jiān)控應(yīng)用的性能。
總結(jié)
在使用Sanic進(jìn)行文件上傳時,除了處理文件本身之外,還需要考慮安全性、性能、用戶體驗等多個方面。通過驗證文件類型、限制文件大小、使用異步IO、提供進(jìn)度反饋以及實施適當(dāng)?shù)谋O(jiān)控和日志記錄,你可以構(gòu)建出既安全又高效的文件上傳功能。
以上就是pyhton Sanic框架實現(xiàn)文件上傳功能的詳細(xì)內(nèi)容,更多關(guān)于pyhton Sanic文件上傳的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python數(shù)據(jù)結(jié)構(gòu)樹與算法分析
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)樹與算法分析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07
Pygame游戲開發(fā)之太空射擊實戰(zhàn)添加圖形篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動手實現(xiàn)它,在編寫學(xué)習(xí)中回顧過往展望未來,在本課中,我們將討論如何在游戲中使用預(yù)先繪制的圖形2022-08-08
Python3利用scapy局域網(wǎng)實現(xiàn)自動多線程arp掃描功能
這篇文章主要介紹了Python3利用scapy局域網(wǎng)實現(xiàn)自動多線程arp掃描功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Python實現(xiàn)指定區(qū)域桌面變化監(jiān)控并報警
在這篇博客中,我們將使用Python編程語言和一些常用的庫來實現(xiàn)一個簡單的區(qū)域監(jiān)控和變化報警系統(tǒng),文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-07-07
淺談keras使用預(yù)訓(xùn)練模型vgg16分類,損失和準(zhǔn)確度不變
這篇文章主要介紹了淺談keras使用預(yù)訓(xùn)練模型vgg16分類,損失和準(zhǔn)確度不變,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編小編過來看看吧2020-07-07
python中用matplotlib畫圖遇到的一些問題及解決
這篇文章主要介紹了python中用matplotlib畫圖遇到的一些問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
python中常用檢測字符串相關(guān)函數(shù)匯總
這篇文章主要介紹了python中常用檢測字符串相關(guān)函數(shù),實例匯總了Python針對字符串?dāng)?shù)字、字母、大小寫等常用檢測函數(shù),非常具有實用價值,需要的朋友可以參考下2015-04-04

