Потоковая передача файлов WSGI с помощью генератора

У меня есть следующий код:

def application(env, start_response): path = process(env) fh = open(path,'r') start_response('200 OK', [('Content-Type','application/octet-stream')]) return fbuffer(fh,10000) def fbuffer(f, chunk_size): '''Generator to buffer file chunks''' while True: chunk = f.read(chunk_size) if not chunk: break yield chunk 

Я не уверен, что это правильно, но обрывки информации, которую я нашел в Интернете, заставили меня думать, что это должно сработать. В принципе, я хочу передать файл в куски, и для этого я передаю генератор из своей прикладной функции. Однако это только распечатывает заголовки и фактически не отправляет какие-либо данные, может ли кто-нибудь сказать мне, почему это так?

Альтернативно, если это совершенно неправильно, что это лучший способ сделать это? Я не могу хранить весь файл в памяти, поскольку файлы, с которыми я буду работать, потенциально гигабайт большой.

Третичный вопрос: как лучше всего закрыть файл, как только я закончил его вывод? В коде, который я разместил, я не вижу, чтобы фактически закрыть файл.

(Я запускаю python 3.2.3 с uWSGI 1.2.4)

One Solution collect form web for “Потоковая передача файлов WSGI с помощью генератора”

Не заботясь о том, что uwsgi осторожно не допускает утечки ошибок, но если вы запустите приложение в более строгой реализации, скажем, тот, который предоставляется с python как wsgiref.simple_server , вы можете более легко увидеть проблему.

 Serving <function application at 0xb65848> http://0.0.0.0:8000 Traceback (most recent call last): File "/usr/lib64/python3.2/wsgiref/handlers.py", line 138, in run self.finish_response() File "/usr/lib64/python3.2/wsgiref/handlers.py", line 179, in finish_response self.write(data) File "/usr/lib64/python3.2/wsgiref/handlers.py", line 264, in write "write() argument must be a bytes instance" AssertionError: write() argument must be a bytes instance localhost.localdomain - - [04/Aug/2012 16:27:08] "GET / HTTP/1.1" 500 59 

Проблема заключается в том, что wsgi требует, чтобы данные, передаваемые в и из HTTP-шлюза, должны обслуживаться как bytes , но когда вы используете open(path, 'r') , python 3 удобно преобразует данные, считываемые в unicode, что в python 3 является str , используя кодировку по умолчанию.

изменения

 fh = open(path, 'r') 

в

 fh = open(path, 'rb') # ^ 

исправляет его.

  • mod_wsgi error - class .__ dict__ недоступен в ограниченном режиме
  • «Os.environ» в настройках django.py не может получить переменные системной среды с apache и wsgi
  • Неблокирующий параллельный сервер wsgi
  • Модули перезагрузки процесса WSGI
  • Объект WSGIRequest не имеет атрибута «пользователь» Django admin
  • колба, mod_wsgi, apache: Importerror:
  • Где WSGIPythonPath указывает мой виртуальный?
  • Django против других веб-фреймворков Python?
  •  
    Interesting Posts for Van-Lav

    Как предварительно обрабатывать данные для машинного обучения?

    Применить границы ко всем ячейкам в диапазоне с помощью openpyxl

    Python получает сфокусированное имя записи

    Почему я не могу активировать свою виртуальную среду Python с помощью команды «source env / bin / activate»?

    Как удалить несколько фреймов pandas (python) из памяти, чтобы сохранить RAM?

    Получить результат из задачи «task_id» в сельдерей из неизвестной задачи

    Модули перезагрузки процесса WSGI

    import input_data MNIST shadoworflow не работает

    Общий массив не был правильно использован для многопроцессорности python

    Фильтр шаблонов Django strip_tags добавляет пространство

    Использование Gecko / Firefox или Webkit получило парсинг HTML в python

    Простой способ создать возможный случай

    Объем выпуклого корпуса с QHull от SciPy

    Получение «невозможно записать режим P в формате JPEG» при работе с изображением JPG

    Как отключить кеш запросов MySQL при использовании SQLAlchemy?

    Python - лучший язык программирования в мире.