Каков наилучший способ реализации «последней увиденной» функции в веб-приложении django? - PullRequest
7 голосов
/ 12 июня 2010

У меня запущено приложение django / apache2 + memcached (ubuntu), и я хотел бы отслеживать зарегистрированных пользователей, которые в сети.

Каков наилучший способ отследить это?

Я бы предпочел не писать в базу данных каждый раз, когда зарегистрированный пользователь загружает страницу; а какие еще есть варианты?

Ответы [ 4 ]

4 голосов
/ 12 июня 2010

Подход может быть следующим:

вы создаете промежуточное программное обеспечение, которое выполняет следующую процедуру process_response:

  • проверяет наличие cookie, называемого «онлайн», но только если пользователь аутентифицирован
  • если файл cookie отсутствует,
    • установить файл cookie с именем «online» со значением «1»
    • установить срок жизни файла cookie равным 10 минутам
    • обновите поле 'last_login' в auth.User для этого пользователя, указав текущую дату и время

. Теперь вы все вошли в систему в своей таблице auth.User.Все пользователи, у которых last_login новее, чем datetime.now () - интервал (15 минут), могут рассматриваться как «онлайн».

База данных будет записываться для каждого вошедшего в систему пользователя примерно каждые 10 минут.Отрегулируйте значения «10» и «15» в соответствии со своими потребностями.

Преимущество здесь в том, что записи в базу данных происходят редко (в соответствии с вашими двумя числовыми настройками 10/15).А для оптимизации скорости убедитесь, что last_login проиндексирован, поэтому фильтр в этом поле, включая Count, очень быстрый.

Надеюсь, это поможет.

1 голос
/ 13 июня 2010

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

Memcached и redis имеют ключи, срок действия которых истекает. Возможно, вы уже установили memcached, так что используйте это.

Вы можете сбрасывать время истечения срока действия клавиши user:last-seen:$username при каждом посещении или использовать технику cookie mawimawi и иметь expiry = 4 * cookie-life.

1 голос
/ 12 июня 2010

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

0 голосов
/ 12 июня 2010

Вы не можете сделать это в django без использования базы данных / постоянного хранения по той же причине, по которой сеансы django хранятся в базе данных: может быть несколько запущенных приложений, и они должны синхронизировать свои состояния + данные через один источник постоянства [1]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...