Тестирование загрузки файлов с помощью Flask и Python 3

Я использую Flask с Python 3.3, и я знаю, что поддержка все еще экспериментальная, но я сталкиваюсь с ошибками при попытке проверить загрузку файлов. я использую unittest.TestCase и на основе примеров Python 2.7, которые я видел в документах, которые я пытаюсь

rv = self.app.post('/add', data=dict(
                               file=(io.StringIO("this is a test"), 'test.pdf'),
                           ), follow_redirects=True)

и получать

TypeError: 'str' does not support the buffer interface

Я пробовал несколько вариантов вокруг io.StringIO, но не могу найти ничего, что работает. Любая помощь высоко ценится!

Полная трассировка стека

Traceback (most recent call last):
  File "archive_tests.py", line 44, in test_add_transcript
    ), follow_redirects=True)
  File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 771, in post
    return self.open(*args, **kw)
  File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/flask/testing.py", line 108, in open
    follow_redirects=follow_redirects)
  File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 725, in open
    environ = args[0].get_environ()
  File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 535, in get_environ
    stream_encode_multipart(values, charset=self.charset)
  File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 98, in stream_encode_multipart
    write_binary(chunk)
  File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 59, in write_binary
    stream.write(string)
TypeError: 'str' does not support the buffer interface

1 ответ

Решение

В Python 3 вам нужно использовать io.BytesIO() (с байтовым значением) для имитации загруженного файла:

rv = self.app.post('/add', data=dict(
                               file=(io.BytesIO(b"this is a test"), 'test.pdf'),
                           ), follow_redirects=True)

Обратите внимание b'...' строка, определяющая bytes буквальный.

В тестовых примерах Python 2 StringIO() объект содержит строку байтов, а не unicode значение, а в Python 3, io.BytesIO() это эквивалент.

Другие вопросы по тегам