Сервер разработки Flask с X-Sendfile

У меня есть приложение Flask, которое будет работать под Apache в процессе производства. У меня есть несколько статических файлов, но для них требуется аутентифицированный доступ. Поэтому использование X-Sendfile показалось разумным для ускорения доставки файлов после аутентификации:

flaskapp = flask.Flask()
flaskapp.use_x_sendfile = True

Затем, где я генерирую ответ:

return flask.send_file(filepath)

Под Apache вроде нормально работает. Проблема в том, что когда я запускаю сервер разработки:

# Use SharedDataMiddleware to deliver JS, CSS, icons, etc.
flaskapp.wsgi_app = SharedDataMiddleware(flaskapp.wsgi_app, {'/static': '/path/to/static'})
flaskapp.run(host='0.0.0.0', debug=True)

Когда я запускаю его таким образом с use_x_sendfile = True, заголовок X-Sendfile появляется в фактическом ответе, и клиенту доставляется пустой файл (0 байт). Отключение X-Sendfile (и принуждение браузера к отбрасыванию кэшированного файла) устраняет проблему, поэтому кажется, что запускаемый Flask сервер Werkzeug не обрабатывает заголовок X-Sendfile. Есть ли способ разрешить серверу разработки обрабатывать X-Sendfile, или мне придется отключить это во время разработки?


person jpmc26    schedule 02.07.2013    source источник


Ответы (1)


В документации flask упоминается, что сервер должен поддерживать X-Sendfile, и dev-сервера нет (нигде в документации нет упоминания, и grep через источник werkzeug для sendfile не дал совпадений).

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

Кстати, поскольку дополнительные аргументы ключевого слова для run передаются в < a href="http://werkzeug.pocoo.org/docs/serving/#werkzeug.serving.run_simple" rel="nofollow">run_simple вам не нужно создавать промежуточное ПО самостоятельно, вы можете просто используйте:

flaskapp.run(host='0.0.0.0', debug=True, static_files={'/static': '/path/to/static'})
person mata    schedule 02.07.2013
comment
Спасибо за совет. Я где-то взял материал SharedDataMiddleware с сайта Flask. - person jpmc26; 03.07.2013