2015-07-14 5 views
2

У меня есть приложение с одной страницей - Angularjs на передней панели и фляжка на бэкэнд, которая позволяет пользователю загружать файл (xlsx, csv ...), а затем интерактивно анализировать/запрашивать файлFlask - Сохранение значений в памяти между запросами

По сути, пользователь загружает файл в память при первой загрузке, а затем последующие вызовы ajax будут использовать этот файл в памяти. Я не уверен, как сохранить файл в памяти между последующими запросами (ajax).

Переменная g стираются после каждого запроса и, если я понимаю право использовать для значений доступа через запрос (набор обычно before_request и доступны все через контекст views

запроса является локальным по отношению к запросу. Я сделал удаешься установить значение на current_app, а затем была в состоянии получить доступ к этому в моей последующей AJAX вызывает

# On my first file upload, i load the file into memory 
and set it to a variable on current_app: 

from flask import current_app 
@app.route('/upload', methods =['POST']) 
def upload(): 
    ... 
    upload file into memory 
    ... 
    current_app.file = file_in_memory 



@app.route('/subsequent_call') 
def subsequent(): 
    # i'm able to access the file in memory through 
    the current_app.file which i set earlier 

    return current_app.file.number_of_lines() 

этот метод сохранение файла в памяти на current_app просто не кажется правильной и чувствует себя слишком грязные/хак. Будут эта шкала вообще?

Я могу разложить файл после каждого запроса и вытащить его для каждого запроса. Но Хранение/травление и повторная загрузка файла каждый раз в память, когда пользователь в интерактивном режиме запрашивает данные, кажется слишком тяжелым/неэффективным.

Есть ли другой элегантный/правильный способ сделать это, app_context, werkzeug locals и т. Д.? Или я думаю, что все это неправильно?

+0

Сохранение состояния на веб-сервер - довольно плохая практика. Почему он должен быть в памяти? – johnharris85

+0

@Jharris: Согласитесь, что состояние хранилища веб-серверов. Файл должен быть в памяти, поскольку я загружаю его в объект pandas. травление объекта панды между запросами кажется слишком неэффективным. –

ответ

2

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

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

EDIT: объяснение того, почему он не будет работать в производстве

Gunicorn и подобные веб-сервера могут порождать множество рабочих, если не ограничивает в конфигурации, работник, по существу, это отдельный процесс, и каждый процесс имеет свое собственное выполнение питона Окружающая среда. Поэтому давайте скажем, что ваш первый запрос поражает worker1, и вы создаете переменную current_app.file = file_in_memory в этом процессе. Затем ваш второй запрос мог бы поразить worker2, у которого есть своя среда исполнения python, где ваша переменная недоступна, потому что они не разделены между процессами. Фактически в этой переменной может быть значение, но оно относится к разному запросу пользователя.

Так что все во всех

  1. Это не гарантирует, что тот же объект доступен через запросы
  2. Он может получить переопределены другим пользователем, который также одновременно используя приложение
+0

Спасибо Shreyas. Im управляет сервером gunicorn с Nginx как обратный прокси.не возражаете ли вы разобраться, почему это не будет работать на производственном сервере? –

+0

@sarul см. Редактирование в ответе – shreyas

+0

Имеет смысл Shreyas. Спасибо ... Один следующий вопрос: я предполагаю, что если я использую фляж-кеш вместо сохранения переменной на current_app, я мог бы преодолеть эту проблему. Но любой ключ к тому, как кеш-кеш направляет правильный запрос правильному работнику? –