使用Python 3的Django SimpleUploadedFile

Aar*_*ier 9 python django python-3.x

有没有人SimpleUploadedFile在Python 3 中使用Django 的工作示例?

此代码适用于Python 2,但不适用于Python 3.

我有以下测试:

test.py

class AttachmentModelTests(TestCase):

    def setUp(self):
        self.model = mommy.make(LocationLevel)

        base_dir = dirname(dirname(dirname(__file__)))
        self.image = join(base_dir, "source/attachments/test_in/test-mountains.jpg")

    def test_create(self):
        _file = SimpleUploadedFile(self.image, "file_content",
            content_type="image/jpeg")
        attachment = Attachment.objects.create(
            model_id=self.model.id,
            file=_file
        )

        self.assertIsInstance(attachment, Attachment)
        self.assertEqual(
            attachment.filename,
            self.image.split('/')[-1] # test-mountains.jpg
        )
Run Code Online (Sandbox Code Playgroud)

这是输出的错误:

Traceback (most recent call last):
  File "/Users/alelevier/Documents/bsrs/bsrs-django/bigsky/generic/tests/test_models.py", line 97, in test_create
    content_type="image/jpeg")
  File "/Users/alelevier/.virtualenvs/bs/lib/python3.4/site-packages/django/core/files/uploadedfile.py", line 114, in __init__
    super(SimpleUploadedFile, self).__init__(BytesIO(content), None, name,
TypeError: 'str' does not support the buffer interface
Run Code Online (Sandbox Code Playgroud)

Aar*_*ier 8

这样的答案帮助我解决了这个问题。

最后,这是更新的工作测试代码:

def test_create(self):
    (abs_dir_path, filename) = os.path.split(self.image)

    with open(self.image) as infile:
        _file = SimpleUploadedFile(filename, infile.read())
        attachment = Attachment.objects.create(
            model_id=self.model.id,
            file=_file
        )

        self.assertIsInstance(attachment, Attachment)
        self.assertEqual(
            attachment.filename,
            self.image.split('/')[-1] # test-mountains.jpg
        )
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你 我发现打开图像时必须包含“ rb”,即将infile中的open(self.image,'rb')与“:”一起使用。 (2认同)