代码之家  ›  专栏  ›  技术社区  ›  Samir Tendulkar

zappa为具有多个图像的Django表单提供413请求实体的错误太大

  •  1
  • Samir Tendulkar  · 技术社区  · 7 年前

    我有一个Django项目,它要求用户使用Addmultipleimagestopost-article。我正在使用django并使用zappa部署它。我知道在Zappa中,页面加载的最大大小是10mb。我有1张后期图片和7张准备图片。当用户添加7个大文件,然后点击提交,我得到下面的错误

    HTTP413:负载太大-服务器拒绝处理负载 请求,因为请求实体比服务器大 愿意或能够处理。

    有没有一种方法可以一个接一个地添加图像,而不是一次添加所有图像,这样表单就不会中断,我就不会出现上述错误

    class Post(models.Model):
        user = models.ForeignKey(User, related_name='posts')    
        title = models.CharField(max_length=250, unique=True)
        message = models.TextField()
        post_image = models.ImageField(upload_to='post_images/')
    
        def save(self, *args, **kwargs):
            im = Image.open(self.post_image)
            super(Post, self).save()
            output = BytesIO()
            basewidth = 700
            wpercent = (basewidth / float(im.size[0]))
            hsize = int((float(im.size[1]) * float(wpercent)))
            im = im.resize((basewidth, hsize))
            # after modifications, save it to the output
            im.save(output, format='JPEG', quality=40)
            output.seek(0) 
            self.post_image = InMemoryUploadedFile(output, 'ImageField', "%s.jpg" % self.post_image.name.split('.')[0], 'image/jpeg',
                                              sys.getsizeof(output), None)
            super().save(*args, **kwargs)
    

    然后我有了一个模型,可以在文章中添加多个图像

    class Prep (models.Model): #(Images)
        post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='post_prep')
        image = models.ImageField(upload_to='post_prep_images/', blank=True, null=True)
        def save(self, force_insert=False, force_update=False, using=None,
                 update_fields=None):
            im = Image.open(self.image)
            output = BytesIO()
            basewidth = 700
            wpercent = (basewidth / float(im.size[0]))
            hsize = int((float(im.size[1]) * float(wpercent)))
            super(Prep, self).save()
            im = im.resize((basewidth, hsize))
            # after modifications, save it to the output
            im.save(output, format='JPEG', quality=300)
            output.seek(0)
    
            # change the imagefield value to be the newley modifed image value
            self.image = InMemoryUploadedFile(output, 'ImageField', "%s.jpg" % self.image.name.split('.')[0], 'image/jpeg',
                                            sys.getsizeof(output), None)
    
            super(Prep, self).save()
    

    在my views.py中,两个模型合并以创建一个表单

    @login_required
    def post_create(request):
        ImageFormSet = modelformset_factory(Prep, fields=('image', 'image_title', 'image_description'), extra=7, max_num=7,
                                            min_num=2)
        if request.method == "POST":
            form = PostForm(request.POST or None, request.FILES or None)
            formset = ImageFormSet(request.POST or None, request.FILES or None)
            if form.is_valid() and formset.is_valid():
                instance = form.save(commit=False)
                instance.user = request.user
                instance.save()
                post_user = request.user
                for f in formset.cleaned_data:
                    try:
                        photo = Prep(post=instance, image=f['image']
                        photo.save()
                    except Exception as e:
                        break
                return redirect('posts:single', username=instance.user.username, slug=instance.slug)
        else:
            form = PostForm()
            formset = ImageFormSet(queryset=Prep.objects.none())
        context = {
            'form': form,
            'formset': formset,
        }
        return render(request, 'posts/post_form.html', context)
    
    0 回复  |  直到 7 年前
        1
  •  3
  •   mislavcimpersak    7 年前

    10MB限制不是Zappa限制,但是 an API gateway limit

    本文对此进行了详细解释: https://sookocheff.com/post/api/uploading-large-payloads-through-api-gateway/

    或者你可以做一些前端魔术,并提出几个较小的要求,一个为您上传的照片。