【问题标题】:Django SimpleUploadedFile with Python 3带有 Python 3 的 Django SimpleUploadedFile
【发布时间】:2016-01-15 09:44:39
【问题描述】:

有没有人有 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
        )

这是它输出的错误:

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

【问题讨论】:

    标签: python django python-3.x


    【解决方案1】:

    这个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
            )
    

    【讨论】:

    • 谢谢。我发现打开图片时必须包含'rb',即with open(self.image, 'rb') as infile:
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2014-08-20
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多