2014-02-16 4 views
1

У меня есть обычный старый код (без сюрпризов).FlaskLogin Выполнение запросов к базе данных Каждая загрузка страницы

@login_manager.user_loader 
def load_user(user_id): 
    print 'loading user' 
    return connection.db.Users.find_one({ '_id' : ObjectId(user_id) }) 
Оценка:

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

Редактировать. Код работает. Нет ничего плохого, кроме того, что я хотел бы уменьшить нагрузку на базу данных.

+1

Если вам нужен кеш, взгляните на фляж-кеш. Вы можете просто кэшировать (memoize) свою функцию. – iurisilvio

ответ

0

Загрузка пользователя из базы данных с каждым запросом довольно стандартная.

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

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

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