使用Python和Django將文件上傳到AWS S3

介紹

為了建立具有更多互動性的網站,我們不僅要向用戶傳遞信息,還要允許他們上傳自己的數據。這為我們的網站提供了更多的服務終端用戶的機會和方式。

通過允許用戶上傳文件,我們可以允許他們與他人分享照片、視頻或音樂,或者為了安全起見備份這些文件。我們還可以通過網站來提供文件管理和轉換成其他格式的功能,而不是安裝本地應用程序。

社交媒體在全球範圍內的崛起可以歸因於用戶能夠上傳文件的能力,這些文件大多以圖片和視頻的形式供其他用戶觀看,同時也是一種交流方式。通過允許用戶上傳文件到網站和平臺,通信手段得到了增強,信息現在可以以多種不同的格式進行傳播。

在這篇文章中,我們將探索Django如何處理文件上傳,以及如何利用雲存儲來開發和擴展這個功能,以滿足我們的需要。

Django如何處理文件存儲

Django不僅允許我們將概念轉換為web應用程序,而且還為我們提供了處理文件的功能,並允許用戶將文件上傳到web應用程序,以便進行進一步的交互。通過表單,用戶可以將文件附加到他們的請求中,並將他們的文件上傳並存儲在我們的後端服務器中。

在一個文件被保存之前,它會被臨時存儲在某個地方,然後再進行處理並將其存儲在預定的最終位置。例如,如果上傳的文件小於2.5MB,該文件的內容將被存儲在內存中,然後在處理過程中完成所有操作後將其寫入磁盤。

這使得處理小文件的速度很快。對於大於2.5MB的文件,在接收到數據時,首先將它們寫入臨時位置,然後在完成處理後將文件移動到最終目的地。

Django中的文件行為可以通過各種設置來進行自定義,比如FILE_UPLOAD_MAX_MEMORY_SIZE,它允許我們修改首先寫入內存而不是臨時位置的文件的2.5MB上傳限制大小。我們還可以通過FILE_UPLOAD_PERMISSIONS來配置上傳文件的默認權限。

其他設置可以在官方Django文檔的這個章節找到。(地址:https://docs.djangoproject.com/en/2.2/ref/settings/#file-uploads )

我們可以把文件存放在哪裡?

在一個基於Django的web應用程序中,我們可以將上傳的文件存儲在不同的位置。我們可以將它們存儲在部署Django代碼的服務器上,也可以將它們發送到其他服務器上,這些服務器可能設置了用於存儲目的的其他位置。

為了降低服務器的維護成本並提高性能,我們也可以選擇不將上傳的文件存儲在我們自己的服務器上。在這種情況下,我們可以將它們交給其他託管存儲提供商(如AWS、Azure或OneDrive等)進行處理

有幾個包允許我們與前面提到的各種服務提供者提供的API進行交互。它們包括:

  • Django-Storages允許我們可以將上傳的文件存儲到AWS Simple Storage Service (S3)、Dropbox、OneDrive、Azure和Digital Ocean中。
  • 通過Django-S3-Storage,我們可以直接將文件上傳到Amazon S3
  • Django-Cumulus允許我們與Rackspace交互以滿足我們的存儲需求
  • 其他的包包括Django-Dropbox、Django-Storage-Swift和Django-Cloudinary-Storage。您在這裡可以找到更多的包。

對於本文,我們將使用Django-s3direct包將我們的文件存儲在AWS的S3上。

我們的應用程序- Django驅動器

我們將使用Django構建一個web應用程序,我們將在其中上傳內容供終端用戶查看。這將通過使用該框架附帶的Django管理接口來實現。

我們的網站將被用來銷售汽車,在它上面,我們將顯示細節,並添加所出售汽車的圖片或視頻。

出售汽車的圖像或視頻將存儲在S3中。為簡潔起見,我們暫時不實現用戶註冊或登錄功能。

設置

我們將使用Pipenv來設置和管理我們的隔離環境,在這個環境中,我們將通過運行以下命令來使用Python3對它進行設置,然後再構建我們的Django應用程序:

使用Python和Django將文件上傳到AWS S3

設置好環境後,我們現在可以安裝Django和Django-s3direct來將文件上傳到S3:

使用Python和Django將文件上傳到AWS S3

在開始實現我們的應用程序的核心功能之前,Django提供了一組命令來引導我們的項目。我們的Django 驅動器項目只有一個應用程序,這將是本文的重點。為此,我們運行以下命令:

使用Python和Django將文件上傳到AWS S3

django-admin startproject ...命令創建了項目,而django-admin startapp ...命令創建了應用程序。

我們設置的最後一步是通過運行migrate命令來創建數據庫表:

使用Python和Django將文件上傳到AWS S3

當我們通過運行manage.py runserver命令開始我們的項目時,我們會看到以下的歡迎頁面,它確認了我們的設置是成功的:

使用Python和Django將文件上傳到AWS S3

由於我們將會把我們的文件上傳到AWS S3,我們需要建立一個免費的AWS帳號來進行演示。設置好之後,我們可以導航到S3儀表板,並創建一個包含我們的上傳內容的新存儲空間。

為了讓Django-s3direct與我們的AWS設置進行交互,我們需要提供以下憑證:AWS_ACCESS_KEY_ID、 AWS_SECRET_ACCESS_KEY和 AWS_STORAGE_BUCKET_NAME。

接下來,我們將在django_drive/settings.py文件中添加以下內容:

使用Python和Django將文件上傳到AWS S3

Django-s3direct允許我們為上傳的文件指定多個目的地,這樣我們可以將不同的文件定向到不同的S3存儲區。對於這個項目,我們將把所有的上傳文件放在一個存儲區中。另一個很棒的功能是,我們還可以限制上傳至我們網站的文件類型。在我們的例子中,我們已經將其限制為僅允許MP4視頻、JPEG和PNG圖像。

注意:更多關於Django-s3direct設置的細節,如CORS和訪問設置,可以在這裡找到。

我們還需要在django_drive/urls.py文件中添加以下條目:

使用Python和Django將文件上傳到AWS S3

實現

我們將首先創建我們汽車數據的模型,該模型將被顯示給終端用戶。這個模型還將定義我們在向平臺添加汽車時在管理儀表板中輸入的信息。該汽車模型如下:

使用Python和Django將文件上傳到AWS S3

對於每一輛汽車,我們將存儲它的名稱、生產年份、價格和一個圖像或視頻。創建模型後,我們將通過運行以下命令來進行遷移,在數據庫中創建表,該數據庫將存儲我們的數據:

使用Python和Django將文件上傳到AWS S3

因為我們將使用Django管理儀表板來管理我們平臺上的汽車,所以我們需要在 django_drive_app/admin.py中註冊我們的模型:

使用Python和Django將文件上傳到AWS S3

然後我們需要通過運行以下命令並遵循提示來創建超級用戶,該用戶將負責添加汽車:

使用Python和Django將文件上傳到AWS S3

python manage.py runserver命令只是重新啟動我們的應用程序。

重新啟動服務器後,我們現在可以在http://127.0.0.1:8000/admin導航到管理儀表板,並使用我們前面指定的憑據登錄。在站點管理下面,我們可以看到我們的DJANGO_DRIVE_APP帶有添加或改變已有汽車的選項。

這是我們用來添加汽車和它的細節的表單:

使用Python和Django將文件上傳到AWS S3

一旦我們保存了我們的汽車,我們就可以在AWS控制檯的S3 存儲區中找到我們已經上傳的圖像。這意味著我們的文件已經被上傳到了AWS。

現在,我們將創建一個視圖,向我們網站的終端用戶顯示汽車及其數據,並顯示與每輛汽車相關的圖像或視頻。我們將在django_drive_app/views.py中創建一個視圖:

使用Python和Django將文件上傳到AWS S3

在這個視圖中,我們使用一個基於類的Django視圖來渲染HTML文件來顯示我們的汽車。在我們的視圖中,我們運行一個查詢來獲取我們數據庫中存儲的所有汽車。

接下來,讓我們創建

django_drive_app/templates/django_drive_app/cars.html來渲染我們的汽車:

使用Python和Django將文件上傳到AWS S3

有了視圖和模板之後,讓我們通過創建django_drive_app/urls.py來添加將用於向最終用戶顯示汽車列表的終端地址:

使用Python和Django將文件上傳到AWS S3

我們導入視圖並添加一個URL入口,以將端點映射到將呈現汽車的視圖。當我們重啟服務器並導航到127.0.0.1:8000/cars/時,我們可以看到以下頁面:

使用Python和Django將文件上傳到AWS S3

正如我們所看到的,我們創建了帶有附加圖像和視頻的汽車,並將它們上傳到了AWS的S3服務中。從AWS獲取數據後,相同的圖像和視頻已在我們的web應用程序中呈現。

結論

在本文中,我們創建了一個簡單的Django應用程序,它允許管理員通過Django管理儀表板將文件上傳到AWS S3。我們在著陸頁面上呈現了S3託管的上傳文件,包括用戶希望購買或查看的汽車的視頻和圖像。

我們使用Django-s3direct庫來處理Django應用程序和存儲文件的AWS S3之間的交互。通過Django管理應用程序,我們能夠上傳最終呈現給終端用戶的文件。我們可以上傳和呈現圖像和視頻。

這個項目的源代碼可以在GitHub上找到。(地址:https://github.com/ro6ley/django-drive )

英文原文:https://stackabuse.com/uploading-files-to-aws-s3-with-python-and-django/

"


分享到:


相關文章: