Py学习  »  Django

使用Python和Django将文件上传到AWS S3

Python程序员 • 4 年前 • 539 次点击  


介绍


为了建立具有更多互动性的网站,我们不仅要向用户传递信息,还要允许他们上传自己的数据。这为我们的网站提供了更多的服务终端用户的机会和方式。


通过允许用户上传文件,我们可以允许他们与他人分享照片、视频或音乐,或者为了安全起见备份这些文件。我们还可以通过网站来提供文件管理和转换成其他格式的功能,而不是安装本地应用程序。


社交媒体在全球范围内的崛起可以归因于用户能够上传文件的能力,这些文件大多以图片和视频的形式供其他用户观看,同时也是一种交流方式。通过允许用户上传文件到网站和平台,通信手段得到了增强,信息现在可以以多种不同的格式进行传播。


在这篇文章中,我们将探索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应用程序:


设置好环境后,我们现在可以安装Django和Django-s3direct来将文件上传到S3:


在开始实现我们的应用程序的核心功能之前,Django提供了一组命令来引导我们的项目。我们的Django 驱动器项目只有一个应用程序,这将是本文的重点。为此,我们运行以下命令:


django-admin startproject ...命令创建了项目,而django-admin startapp ...命令创建了应用程序。


我们设置的最后一步是通过运行migrate命令来创建数据库表:


当我们通过运行manage.py runserver命令开始我们的项目时,我们会看到以下的欢迎页面,它确认了我们的设置是成功的:



由于我们将会把我们的文件上传到AWS S3,我们需要建立一个免费的AWS帐号来进行演示。设置好之后,我们可以导航到S3仪表板,并创建一个包含我们的上传内容的新存储空间。


>>>今日签到口令: 3bge<<<


为了让Django-s3direct与我们的AWS设置进行交互,我们需要提供以下凭证:AWS_ACCESS_KEY_ID、 AWS_SECRET_ACCESS_KEY和 AWS_STORAGE_BUCKET_NAME。


接下来,我们将在django_drive/settings.py文件中添加以下内容:


Django-s3direct允许我们为上传的文件指定多个目的地,这样我们可以将不同的文件定向到不同的S3存储区。对于这个项目,我们将把所有的上传文件放在一个存储区中。另一个很棒的功能是,我们还可以限制上传至我们网站的文件类型。在我们的例子中,我们已经将其限制为仅允许MP4视频、JPEG和PNG图像。


注意:更多关于Django-s3direct设置的细节,如CORS和访问设置,可以在这里找到。


我们还需要在django_drive/urls.py文件中添加以下条目:


实现


我们将首先创建我们汽车数据的模型,该模型将被显示给终端用户。这个模型还将定义我们在向平台添加汽车时在管理仪表板中输入的信息。该汽车模型如下:


对于每一辆汽车,我们将存储它的名称、生产年份、价格和一个图像或视频。创建模型后,我们将通过运行以下命令来进行迁移,在数据库中创建表,该数据库将存储我们的数据:


因为我们将使用Django管理仪表板来管理我们平台上的汽车,所以我们需要在 django_drive_app/admin.py中注册我们的模型:


然后我们需要通过运行以下命令并遵循提示来创建超级用户,该用户将负责添加汽车:


python manage.py runserver命令只是重新启动我们的应用程序。


重新启动服务器后,我们现在可以在http://127.0.0.1:8000/admin导航到管理仪表板,并使用我们前面指定的凭据登录。在站点管理下面,我们可以看到我们的DJANGO_DRIVE_APP带有添加或改变已有汽车的选项。


这是我们用来添加汽车和它的细节的表单:



一旦我们保存了我们的汽车,我们就可以在AWS控制台的S3 存储区中找到我们已经上传的图像。这意味着我们的文件已经被上传到了AWS。


现在,我们将创建一个视图,向我们网站的终端用户显示汽车及其数据,并显示与每辆汽车相关的图像或视频。我们将在django_drive_app/views.py中创建一个视图:


在这个视图中,我们使用一个基于类的Django视图来渲染HTML文件来显示我们的汽车。在我们的视图中,我们运行一个查询来获取我们数据库中存储的所有汽车。


接下来,让我们创建


django_drive_app/templates/django_drive_app/cars.html来渲染我们的汽车:


有了视图和模板之后,让我们通过创建django_drive_app/urls.py来添加将用于向最终用户显示汽车列表的终端地址:


我们导入视图并添加一个URL入口,以将端点映射到将呈现汽车的视图。当我们重启服务器并导航到127.0.0.1:8000/cars/时,我们可以看到以下页面:

正如我们所看到的,我们创建了带有附加图像和视频的汽车,并将它们上传到了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/ 
译者:天天向上


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/48133
 
539 次点击