【问题标题】:Takes very long for an image/video to be uploaded to my Amazon S3 media directory将图像/视频上传到我的 Amazon S3 媒体目录需要很长时间
【发布时间】:2018-03-11 11:51:47
【问题描述】:

所以我使用 Amazon S3 存储来存储用户上传的文件。当用户在我的 Django 网站上发帖时,它会附带一些文本和图像/视频 - 该图像/视频会上传到我的 S3 存储桶上的 media 目录。

但是这需要很长时间,例如在帖子中包含 6mb 的图片将花费一分钟以上的时间来提交。如果图像很小,例如150kb 提交帖子只需大约 3 秒。我怎样才能提高这个性能?

Post 只是一个包含以下字段的表单(image 是图像或视频):

class Post(models.Model):
    user = models.ForeignKey(User, blank=True, null=True)
    title = models.TextField(max_length=95)
    date = models.DateTimeField(auto_now_add=True)
    content = models.TextField(null=True, blank=True)
    image = models.FileField(null=True, blank=True)

和意见:

def post(request):

    if request.user.is_authenticated():
        form_post = PostForm(request.POST or None, request.FILES or None)
        if form_post.is_valid():
            instance = form_post.save(commit=False)
            instance.user = request.user

            instance.save()

            return HttpResponseRedirect('/home/')
        else:
            form_post = PostForm()

        context = {
            'form_post': form_post,
        }

        return render(request, 'post/post.html', context)
    else:
        return HttpResponseRedirect("/accounts/signup/")

有什么想法吗?

【问题讨论】:

  • 在上传之前缩小图像文件或通过升级到更昂贵的合同来增加服务器的上游。
  • 哪一栏向我展示了改进的上游性能?:i.imgur.com/RYY3P4D.png
  • 无。它只显示音量。
  • 看起来您正在使用 DigitalOcean。您应该适当地标记 DO 问题。

标签: python django amazon-web-services amazon-s3 digital-ocean


【解决方案1】:

您应该尝试在 API 端点处理程序之外处理昂贵、长时间运行的操作,例如将文件上传到 S3。
它将使您的 Web 应用程序更加健壮和可扩展,并且您不必处理可能超时的运行 HTTP 请求的日志,并且您可以让用户了解正在发生的事情。

您可以使用例如Celery 处理排队。

【讨论】:

    【解决方案2】:

    您可以使用django-queued-storage 管理本地/远程存储上传和检索的实际案例。

    他们的文档中的代码示例以进行澄清。

    from django.db import models
    from queued_storage.backends import QueuedStorage
    from storages.backends.s3boto import S3BotoStorage
    
    queued_s3storage = QueuedStorage(
        'django.core.files.storage.FileSystemStorage',
        'storages.backends.s3boto.S3BotoStorage')
    
    class MyModel(models.Model):
        image = ImageField(storage=queued_s3storage)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-27
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多