2013-09-18 1 views
8

Я пишу веб-приложение, которое получает много данных с стороннего сервера, когда (и только когда) пользователь входит в систему. Эти данные анализируются на пользовательские объектов и хранится в list(). Теперь пользователь работает с этими данными по всему приложению, вызывая разные представления (например, отправляя разные запросы). Я не уверен, что лучший образец для передать список объектов между функциями вида?Как передать сложные объекты в виде функций/сессий в Flask

я технически вижу две возможности, но оба имеют недостатки в моем случае:

  1. Сеанс ДИКТ: Сохранение данных в сессии излишеством (весь список будет посылать туда и обратно между сервера и браузера по каждому запросу)
  2. Сохранение: Временно сохраняющиеся данные в базе данных кажутся более адекватными. Но я надеялся не использовать базу данных вообще (за исключением этих временных данных у меня нет данных, которые нужно хранить локально, все остальное получено с сервера третьей стороны и отправлено обратно).

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

ответ

5

Несмотря на то, что реализация Flask по умолчанию для сеансов - хранить данные в файле cookie, это не единственный способ сделать это. Как правило, вы храните идентификатор сеанса в файле cookie, а сами данные хранятся где-то на сервере и извлекаются через этот файл cookie.

Фланец предоставит вам простой способ переопределить реализацию сеанса по умолчанию, и есть различные рецепты, показывающие, как это сделать - here's вопрос, который показывает схему.

4

Flask-Cache (flask.ext.cache)SimpleCache (что действительно werkzeug.contrib.cache.SimpleCache) для хранения данных в памяти в приложении. Единственная проблема заключается в том, что у вас будет один экземпляр кэша на серверный процесс (если вы находитесь за uwsgi или работаете в mod_wsgi, у вас, скорее всего, будет более одного запроса обработки). Таким образом, пользователь может ударить по одной конечной точке вашего приложения, заплатить цену за выборку данных, а затем по следующему запросу обратиться к другому процессу и снова оплатить эту стоимость (потому что, хотя процесс A имеет кеширование данных , Процесс B не является).

Единственный способ обойти это - использовать хранилище вне процесса (либо кеш родительского процесса, либо отдельный процесс Python, который действует как сервер кэш-памяти или некоторое хранилище персистентности [Redis, PostGres и т. Д. .])

+0

Спасибо. Я переопределяю реализацию сеанса по умолчанию, используя Redis, который я нашел благодаря вашему ответу. – cyphorious

Смежные вопросы