Django 1.7 ImageField 表单验证

2023-12-07

我正在使用 Django 1.7 和 Python 3.4 编写单元测试。下面的表格可以很好地验证file_data元素被注释掉。随着file_data包括它不验证并且测试失败。

from django.core.files.uploadedfile import SimpleUploadedFile
...

data = {
    'phone_number': '123456',
    'job': Job.objects.latest('id').pk,
}
file_data = {
    'portrait': SimpleUploadedFile(
        content=b'',
        content_type='image/jpeg',
        name='test.jpg',
    )
}
form = PersonForm(data, file_data)
self.assertTrue(form.is_valid())

类似的代码适用于FileField将测试上传到我网站的其他地方。在 shell 中运行代码我得到以下内容form.errors: 'Upload a valid image. The file you uploaded was either not an image or a corrupted image.'因此我认为问题要么在于content or content_type字段。我尝试过使用图像作为字符串,如这个答案无济于事。[编辑:图像作为字符串的方法实际上是答案,但我一定实施得很糟糕。接受的答案已验证有效。]我在其中找不到任何线索简单上传文件源代码.

该表格在现实中工作正常,但我想确保它被涵盖在未来维护的工作测试中。理想情况下,我想避免必须有一个实际的test.jpg文件存在,因为图像在我的中.gitignore文件,我不想开始破解当前非常顺利的自动化部署。

我应该提供什么输入SimpleUploadedFile以便它正确验证?


跑步有什么区别吗Image你的测试套件和工作代码之间有lib吗?可以吗Imagelib 能否正确处理 GIF 等文件?您可能需要检查PIL/pillow安装也是如此。

SimpleUploadedFile(name='foo.gif', 
                   content=b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00')

对我有用。

该表单内部依赖于forms.ImageField测试其图像to_python(),以如下方式:

import io
from django.utils.image import Image
Image.open(io.BytesIO(image_content)).verify()

任何例外情况verify()行会导致错误'Upload a valid image...'。您可以通过将其分配给来检查图像字节image_content:

image_content = b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00'

也适合我。

另外,您可以在线生成图像字节:

import io    
from django.utils.image import Image
fp = io.BytesIO()
Image.new('P', (1,1)).save(fp, 'png')
fp.seek(0)
portrait = SimpleUploadedFile(name=''foo, content=fp.read())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 1.7 ImageField 表单验证 的相关文章

随机推荐