Django-用户注销后清除用户缓存

时间:2019-07-18 09:46:20

标签: python django django-authentication django-signals

我正在使用django.core.cache将与用户角色相关的数据存储在缓存中。用户角色作为键roles_<user.id>存储在缓存中。

每当用户从系统注销时,我都希望从缓存中删除roles_<user.id>键。

为此,我使用了 user_logged_out 身份验证信号,但是该信号无法正常工作(不删除缓存数据)。

我已经在 signals.py 中创建了一个接收器,如下所示:

def clear_user_cache(sender, user, request, **kwargs):
    cache.delete('roles_{}'.format(user.id))


user_logged_out.connect(clear_user_cache)

我的注销网址是:

url(r'^accounts/logout/', 'django.contrib.auth.views.logout', {'next_page': '/'}, name='auth_logout'),

退出模板:

<a class="dropdown-item" href="{% url 'auth_logout' %}"><i class="la la-sign-out"></i>{% trans 'Logout' %}</a>

当我按下注销按钮时,用户已注销,但未清除缓存。如果我尝试在信号接收器中打印一些语句,则不会被打印。

我虽然模板中的url可能导致了此问题,所以我尝试将其更改为:

<a class="dropdown-item" href="/logout"><i class="la la-sign-out"></i>{% trans 'Logout' %}</a>

但还是什么也没发生。

如何使用户注销时发出注销信号?

我正在使用Django == 1.8.18和python2.7

2 个答案:

答案 0 :(得分:1)

尚未注册类似您的信号的声音。如果 signals.py 文件位于用户应用中,则需要修改 user / apps.py user / __ init__。 py

您也可以通过导入模型来注册它们,但是我认为这种方式更简洁。

# apps.py

from django.apps import AppConfig

class UserConfig(AppConfig):
    name = 'user'

    def ready(self):
        from . import signals


# __init__.py

default_app_config = 'user.apps.UserConfig'

答案 1 :(得分:0)

正如@bdoubleu在他的回答中暗示我的信号可能尚未注册,我尝试在 users / __ init __。py 文件而不是 signals.py 中定义接收器函数。 strong>。

每当用户从系统注销并清除相应用户的用户缓存时,这都会激活信号。

这种方法易于实现,并且确实解决了我的查询问题。我愿意接受任何其他比这种方法更好的建议。