Python I / O: как использовать поток wsgi.input из модуля io - PullRequest
1 голос
/ 01 декабря 2011

В приложении WSGI мы можем прочитать входные данные строки из поля wsgi.input :

def application(env, start_response):
        .....
        data = env['wsgi.input'].read(num_bytes)
        .....

Однако я хочу обернуть файловый объект, используя io module:

import io
def application(env, start_response):
        .....
        f = io.open(env['wsgi.input'], 'rb')
        buffer = bytearray(buff_size)
        read = f.readinto(buffer)
        .....

Проблема в том, что io.open не принимает файловые объекты такого типа.Есть идеи, как это сделать?Мне нужно прочитать из env['wsgi.input'] в буфер.

1 Ответ

2 голосов
/ 01 декабря 2011

Функция io.open() не принимает файл-объект в качестве первого параметра.

Однако он принимает целое число, представляющее дескриптор открытого файла.так что вы можете добиться успеха, используя:

f = io.open(env['wsgi.input'].fileno, 'rb')

Приложение:

Модуль io написан для Python 3, где обработка строк сильно отличается от Python 2.вызов read() для файла, открытого в двоичном режиме, возвращает объект bytes в Python 3, но str в Python 2, но при переносе файла с использованием модуля io и использования двоичного режима модуль io ожидаетread() чтобы вернуть bytes.

Вы можете попытаться исправить исходный файловый объект, вернув ему bytes:

def fix(file):
    # wrap 'func' to convert its return value to bytes using the specified encoding
    def wrap(func, encoding):
        def read(*args, **kwargs):
            return bytes(func(*args, **kwargs), encoding)
        return read
    file.read = wrap(file.read, 'ascii')

fix(env['wsgi.input'])
f = io.open(env['wsgi.input'].fileno, 'rb')

Вышеприведенная функция переносит метод read(), но может быть завершена для переноса readline(),также требуется небольшая дополнительная работа, чтобы обернуть readlines() ...

...