Можно ли как-то принудительно сделать logout для пользователя, который бродит по сайту, но еще не знает, что модератор уже поставил ему user.is_active = False в качестве наказания?
Получается этакий человек-зомби - уже прибили, но пока он сам не выйдет - ничего с ним не сделаешь. Даже становится не по себе, если вспомнить, что у пользователей есть привычка вообще никогда не нажимать "Выход".Страшно подумать, что он понапишет в коментах, к примеру, если прочтет сообщение от модератора, где сказано, что его больше не любят и не ждут на этом сайте.
--
В общем, да, вы можете написать мидлеварь.
> Получается этакий человек-зомби - уже прибили, но пока он сам не выйдет -
> ничего с ним не сделаешь. Даже становится не по себе, если вспомнить, что у
> пользователей есть привычка вообще никогда не нажимать "Выход".
Но на самом деле, причин для паники нет, достаточно задуматься.
> Страшно подумать, что он понапишет в коментах, к примеру, если прочтет
> сообщение от модератора, где сказано, что его больше не любят и не ждут на
> этом сайте.
Ничего не напишет, т.к. не сможет. Я надеюсь, что ваш сайт проверяет
права пользователя, а значит и атрибут is_active при каждом его
действии, а не складывает ему в сессию информацию о том, что он может
делать, а что нет.
Если вы все написали правильно, то ваш пользователь будет волшебным
образом получать отказ в любом действии, в котором вы проверяете
свойство is_active (т.е. везде где он вообще что-то может сделать).
Джанговский бэкенд по-умолчанию делает это в user.has_perm.
Таким образом, этот пользователь даже не сможет просматривать страницы
сайта, доступные только активным пользователям, если вы это
проверяете.
Вообще, я посмотрел код и удивился. is_authenticated, а значит и
login_required никак не проверяют свойство is_active. Очень странно.
--
Serge Matveenko
mailto: se...@matveenko.ru
github: http://lnkfy.com/1
linkedin: http://lnkfy.com/S
--
--
--
--
Если есть задача, в которой нужно обойти всех пользователей и что-нибудь с ними сделать(баланс свести с транзакциями например) - то она станет значительно медленее выполнятся - сделайте tail -f /query_log_for_db_you_use, чтобы посмотреть как работает сигнал... Хотя общие задачи лучше без ORM решать вообще. Возможно у меня кризис и я даю опасные советы.Сигналы и миддлевари - для общих случаев. Разлогин пользователя - частный случай.
--
--
Можно ли как-то принудительно сделать logout для пользователя, который бродит по сайту, но еще не знает, что модератор уже поставил ему user.is_active = False в качестве наказания?
Получается этакий человек-зомби - уже прибили, но пока он сам не выйдет - ничего с ним не сделаешь. Даже становится не по себе, если вспомнить, что у пользователей есть привычка вообще никогда не нажимать "Выход".Страшно подумать, что он понапишет в коментах, к примеру, если прочтет сообщение от модератора, где сказано, что его больше не любят и не ждут на этом сайте.
Вот тут важная мысль. Имхо, active по его сути в коде джанго стоит
использовать только для активации пользователя. Т.е. он сначала
is_active=False, потом активируется и становится is_active=True. А
дальше все должно делаться логикой вашего приложения. Т.е. если бан,
то is_banned = True, если права, то права. Тогда у вас сразу станет
все хорошо: вы сможете быть уерены, что юзеры получат только то, что
им пожно получить, и увидят те алерты, которые им должно увидеть.
В таком случае, тому же забаненому пользователю можно оставить права
написать аппеляцию, например.
--
--
--
А что не устраивает? По-хорошему, надо в любом случае сессии именно в нём хранить (https://github.com/martinrusev/django-redis-sessions). По крайней мере, так ты избавляешься от дополнительных запросов к БД при каждой проверке сессии.