使用Python 3的Django SimpleUploadedFile

时间:2015-10-16 15:10:48

标签: python django python-3.x

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

此代码适用于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
        )

以下是输出的错误:

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

1 个答案:

答案 0 :(得分:5)

SO answer帮我解决了。

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

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
        )