Python — какого типа должен быть flask.request.files.stream?

В Flask (Flask-0.10.1, установленный через pip) я пытался обрабатывать загруженные файлы, подобные этому

f = flask.request.files[input_name]
stream = f.stream
# then use the stream

Но сбивает с толку то, что в некоторых случаях stream является экземпляром BytesIO, но также может быть и объектом file.

Я тестировал таким образом

from flask import Flask, request
import cStringIO

app = Flask('test')

@app.route("/", methods=['POST'])
def index():
    if request.method == 'POST':
        f = request.files['file']
        print type(f.stream)

def send_file(client, name):
    with open(name, 'rb') as f:
        client.post('/', data={'file': (cStringIO.StringIO(f.read()), name)})

if __name__ == "__main__":
    with app.test_client() as client:
        send_file(client, 'homercat.png')
        send_file(client, 'megacat-2.png')

Он печатает

<type '_io.BytesIO'>
<type 'file'>

Файлы PNG взяты с github:

http://octodex.github.com/images/homercat.png http://octodex.github.com/images/megacat-2.png

Интересно, почему Flask ведет себя таким образом. И если я хочу, чтобы загруженные данные отправлялись в базу данных, можно ли вызывать f.stream.read() в обоих случаях?


person neuront    schedule 15.08.2013    source источник


Ответы (1)


Файлы меньше 1024 * 500 байт записываются в объект StringIO, а файлы больше этого порога записываются во временные файлы.

Это часть среды тестирования Werkzeug, но эта функция не является частью онлайн-документации:

def stream_encode_multipart(values, use_tempfile=True, threshold=1024 * 500,
                            boundary=None, charset='utf-8'):
    """Encode a dict of values (either strings or file descriptors or
    :class:`FileStorage` objects.) into a multipart encoded string stored
    in a file descriptor.
    """

    ...

Источник

person Blender    schedule 15.08.2013
comment
Я узнал об этом из этого списка gist.github.com/lost-theory/3772472, и это вызывает исключение, когда я меняю местами элементы в кортеже. - person neuront; 15.08.2013