Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django SimpleUploadedFile with Python 3

Does anyone have a working example of SimpleUploadedFile with Django in Python 3?

This code worked in Python 2, but not in Python 3.

I have the below test:

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
        )

Here is the error it's outputting:

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
like image 859
Aaron Lelevier Avatar asked Oct 16 '15 15:10

Aaron Lelevier


1 Answers

This SO answer helped me solve it.

In the end, this is the updated working test code:

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
        )
like image 188
Aaron Lelevier Avatar answered Oct 21 '22 18:10

Aaron Lelevier