欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python Sanic框架實(shí)現(xiàn)文件上傳功能

 更新時(shí)間:2024年08月26日 10:22:22   作者:景天科技苑  
Sanic是一個(gè)Python 3.5+的異步Web框架,它的設(shè)計(jì)理念與Flask相似,但采用了更高效的異步I/O處理,在處理文件上傳時(shí),Sanic同樣提供了方便、高效的方法,本教程將結(jié)合實(shí)際案例,詳細(xì)介紹如何在Sanic框架中實(shí)現(xiàn)文件上傳的功能,需要的朋友可以參考下

前言

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框架。如果沒有安裝Sanic,可以通過pip命令進(jìn)行安裝:

pip install sanic

基本概念

在Sanic中,文件上傳通常是通過request.files屬性來實(shí)現(xiàn)的。當(dāng)客戶端以multipart/form-data的方式發(fā)送POST請(qǐng)求時(shí),可以通過request.files.get('filename')來獲取指定的文件對(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)行處理,這里簡單地將文件保存到本地

        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. 客戶端上傳文件

為了測試文件上傳功能,我們需要一個(gè)客戶端來發(fā)送文件??梢允褂肞ostman這樣的工具,或者使用Python的requests庫來發(fā)送請(qǐng)求。

使用Postman

  1. 打開Postman,創(chuàng)建一個(gè)新的POST請(qǐng)求。
  2. 在請(qǐng)求URL中輸入http://localhost:8000/upload。
  3. 設(shè)置Headers中的Content-Typemultipart/form-data。
  4. 在Body中選擇form-data,然后點(diǎn)擊Add file選擇你要上傳的文件。
  5. 然后在Value處點(diǎn)擊Search Files選擇需要上傳的文件。
  6. 發(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庫

我們現(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": "沒有文件被上傳"}, 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來生成唯一的文件名。
  • 限制上傳目錄的權(quán)限:確保上傳目錄的權(quán)限設(shè)置得當(dāng),以防止未授權(quán)訪問或執(zhí)行上傳的文件。
  • 使用HTTPS:在生產(chǎn)環(huán)境中,始終使用HTTPS來保護(hù)用戶數(shù)據(jù)和文件傳輸?shù)陌踩浴?/li>

5. 進(jìn)度反饋

對(duì)于大文件上傳,用戶可能會(huì)希望看到上傳進(jìn)度。然而,Sanic本身并不直接支持上傳進(jìn)度的跟蹤。但是,你可以通過前端JavaScript(如使用XMLHttpRequest或Fetch API的upload事件)來跟蹤上傳進(jìn)度,并通過WebSocket、Server-Sent Events (SSE) 或輪詢等方式將進(jìn)度信息發(fā)送到服務(wù)器,然后服務(wù)器可以將這些信息廣播給需要它們的客戶端。

6. 異步文件處理

如果你需要在文件上傳后執(zhí)行一些耗時(shí)的處理(如圖像分析、視頻轉(zhuǎn)碼等),并且這些處理不需要立即返回結(jié)果給用戶,你可以將這些處理任務(wù)放入后臺(tái)執(zhí)行。這可以通過將任務(wù)提交到消息隊(duì)列(如RabbitMQ、Kafka)或使用后臺(tái)工作進(jìn)程(如Celery)來實(shí)現(xiàn)。

7. 監(jiān)控和日志

對(duì)于生產(chǎn)環(huán)境中的應(yīng)用,監(jiān)控和日志記錄是非常重要的。你可以使用Sanic的日志系統(tǒng)來記錄關(guān)鍵事件和錯(cuò)誤,并使用如Prometheus、Grafana等工具來監(jiān)控應(yīng)用的性能。

總結(jié)

在使用Sanic進(jìn)行文件上傳時(shí),除了處理文件本身之外,還需要考慮安全性、性能、用戶體驗(yàn)等多個(gè)方面。通過驗(yàn)證文件類型、限制文件大小、使用異步IO、提供進(jìn)度反饋以及實(shí)施適當(dāng)?shù)谋O(jiān)控和日志記錄,你可以構(gòu)建出既安全又高效的文件上傳功能。

以上就是pyhton Sanic框架實(shí)現(xiàn)文件上傳功能的詳細(xì)內(nèi)容,更多關(guān)于pyhton Sanic文件上傳的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 75條笑死人的知乎神回復(fù),用60行代碼就爬完了

    75條笑死人的知乎神回復(fù),用60行代碼就爬完了

    這篇文章主要介紹了python爬取知乎回復(fù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 在Python中編寫數(shù)據(jù)庫模塊的教程

    在Python中編寫數(shù)據(jù)庫模塊的教程

    這篇文章主要介紹了在Python中編寫數(shù)據(jù)庫模塊的教程,本文代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • python基于Pandas讀寫MySQL數(shù)據(jù)庫

    python基于Pandas讀寫MySQL數(shù)據(jù)庫

    這篇文章主要介紹了python基于Pandas讀寫MySQL數(shù)據(jù)庫,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • Python利用Turtle繪制哆啦A夢(mèng)和小豬佩奇

    Python利用Turtle繪制哆啦A夢(mèng)和小豬佩奇

    turtle庫是python的基礎(chǔ)繪圖庫,經(jīng)常被用來介紹編程知識(shí)的方法庫,是標(biāo)準(zhǔn)庫之一,利用turtle可以制作很多復(fù)雜的繪圖。本文將為大家介紹通過turtle庫繪制制哆啦A夢(mèng)和小豬佩奇,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-04-04
  • 淺談Python類中的self到底是干啥的

    淺談Python類中的self到底是干啥的

    這篇文章主要介紹了淺談Python類中的self到底是干啥的,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python使用rpc框架gRPC的方法

    python使用rpc框架gRPC的方法

    這篇文章主要為大家詳細(xì)介紹了python使用rpc框架gRPC的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • python使用matplotlib模塊繪制多條折線圖、散點(diǎn)圖

    python使用matplotlib模塊繪制多條折線圖、散點(diǎn)圖

    這篇文章主要為大家詳細(xì)介紹了python使用matplotlib模塊繪制多條折線圖、散點(diǎn)圖的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python:刪除離群值操作(每一行為一類數(shù)據(jù))

    python:刪除離群值操作(每一行為一類數(shù)據(jù))

    這篇文章主要介紹了python:刪除離群值操作(每一行為一類數(shù)據(jù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • pytorch中交叉熵?fù)p失函數(shù)的使用小細(xì)節(jié)

    pytorch中交叉熵?fù)p失函數(shù)的使用小細(xì)節(jié)

    這篇文章主要介紹了pytorch中交叉熵?fù)p失函數(shù)的使用細(xì)節(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python機(jī)器學(xué)習(xí)NLP自然語言處理基本操作家暴歸類

    Python機(jī)器學(xué)習(xí)NLP自然語言處理基本操作家暴歸類

    本文是Python機(jī)器學(xué)習(xí)NLP自然語言處理系列文章,帶大家開啟一段學(xué)習(xí)自然語言處理 (NLP) 的旅程。本篇文章主要學(xué)習(xí)NLP自然語言處理家暴歸類
    2021-09-09

最新評(píng)論