Что лучший способ состоит в том, чтобы реализовать 'последнюю замеченную' функцию в django веб-приложении?

Я имею выполнение django/apache2 + memcached приложение (человечность) и хотел бы отслеживать зарегистрированных пользователей, которые онлайн.

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

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

7
задан Hobhouse 12 June 2010 в 08:12
поделиться

4 ответа

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

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

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

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

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

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

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

4
ответ дан 7 December 2019 в 09:56
поделиться

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

1
ответ дан 7 December 2019 в 09:56
поделиться

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

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

0
ответ дан 7 December 2019 в 09:56
поделиться

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

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

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

1
ответ дан 7 December 2019 в 09:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: