繁体   English   中英

"在 Django REST Framework 中测试图像上传"

Testing image uploads in Django REST Framework

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试向 Django 项目中的一个应用程序添加一些测试。 这个应用程序包括Image模型:

from django.db import models
from django.utils.translation import gettext_lazy as _

from cecommerce.image_mappings import ImageAgnosticMapping
from cecoresizer.fields import ResizableImageField


class Image(models.Model):
    file = ResizableImageField(
        _("Image"),
        max_length=300,
        image_config=ImageAgnosticMapping,
    )

    def __str__(self):
        return str(self.file)

然后使用以下序列化程序对其进行序列化:

from django.http import Http404

from rest_framework import serializers

from cecotec_apps.landings.models import ProductLanding
from cecotec_apps.partner.models import Home

from images.models import Image


class ImageSerializer(serializers.ModelSerializer):
    file = serializers.ImageField()

    def to_representation(self, instance):
        return {"file": str(instance)}

    class Meta:
        model = Image
        exclude = ("id",)

我正在尝试使用此测试来测试Image实例的创建(在使用 Imsonia 请求 API 时有效):

import tempfile

from PIL import Image as ImageFile

from django.test import tag

from model_bakery import baker

from rest_framework.test import APITestCase
from rest_framework.authtoken.models import Token
from rest_framework.reverse import reverse


from cecotec_apps.landings.models import ProductLanding
from cecotec_apps.partner.models import Home

from images.api.serializers import ImageSerializer
from images.models import Image

from tests.oscar.decorator.decorator_all_methods import global_test_decorator

from user.models import User


@tag("e2e", "image")
@global_test_decorator()
class ImageTestCase(APITestCase):
    API_VERSION = "v1"
    IMAGES_QUANTITY = 20
    HTTP_HOST = "localhost:8000"

    @classmethod
    def _populate(cls):
        cls.token = baker.make(Token)
        baker.make_recipe("images.image_recipe", _quantity=cls.IMAGES_QUANTITY)

    @classmethod
    def _generate_image_file(cls):
        with tempfile.NamedTemporaryFile(suffix="jpg") as tmp_file:
            image = ImageFile.new("RGB", size=(100, 100))
            image.save(tmp_file, "jpeg")
            tmp_file.seek(0)

            return tmp_file

    @classmethod
    def _depopulate(cls):
        Token.objects.all().delete()
        User.objects.all().delete()
        ProductLanding.objects.all().delete()
        Home.objects.all().delete()
        Image.objects.all().delete()

    def setUp(self, *args):
        self._depopulate()
        self._populate()

    def tearDown(self, *args):
        self._depopulate()

    @tag("create", "authenticated")
    def test_create_authenticated(self, *args):
        self.client.force_authenticate(user=self.token.user, token=self.token)

        data = self._prepare_create_data(**{"file": self._generate_image_file()})

        response = self._call_create(data)

        self._assert_create(response)
        self.assertRegex(response.data.get("file"), "^images\/.+$")

    def _call_create(self, data):
        return self.client.post(
            path=reverse(f"image-list"),
            data=data,
            # content_type=MULTIPART_CONTENT,
            format="multipart",
            HTTP_HOST=self.HTTP_HOST,
        )

    def _assert_create(self, response, expected_status_code=201):
        self.assertEqual(response.status_code, expected_status_code)

        if expected_status_code == 201:
            response_data = response.data

            self.assertEqual(Image.objects.count(), self.IMAGES_QUANTITY + 1)
            self._assert_response_body(response_data)
        else:
            self.assertEqual(Image.objects.count(), self.IMAGES_QUANTITY)

    def _assert_response_body(self, response_body):
        self.assertIn("file", response_body)

但是,运行它时返回的响应代码是400 Bad Request而不是201 Created 响应正文是这样的:

{
    "file": [
        ErrorDetail(string="The submitted data was not a file. Check the encoding type on the form.",
        code="invalid")
    ]
}

我也尝试使用已经创建的文件进行测试,但错误是一样的。 我在网上看过很多帖子,但没有一个可以帮助我解决这个问题。

我会很感激一些帮助。 提前致谢。

问题暂未有回复.您可以查看右边的相关问题.
2 Django rest 框架 - 多个图像上传未显示

我想按照这个答案在 Post 模型中上传多个图像。 作为管理员,我可以成功地将多张图片上传到证书字段,但是当我在浏览器中查看帖子详细信息或帖子列表页面时,证书不会显示。 这是json: 出于某种原因,在管理员中上传的证书图像未显示在帖子详细信息或列表页面上。 以下是模型: 序列化器: ...

6 Django Rest Framework单元测试

我在那儿,所以我尝试使用DRF单元测试,而.post出现了一些问题 我认为这与我使用的外键有关,但是我找不到任何好的示例。 串行: 楷模: 因此,我在此端点中使用的身体数据是: 然后我使用response = self.client.post(url, dat ...

10 上传图片-Django Rest Framework

我有2个User和EcoUser模型,它们之间的关系是1到1(对于本示例,我减少了表的字段): 在其中,我使用NestedSerializer可以在单个帖子中创建和更新两个表的数据,或者以这种方式放置更新,因为在寄存器中我不保留图像并且对此没有问题: 这是序列化器 : 在我 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM