我正在使用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
答案 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>。
每当用户从系统注销并清除相应用户的用户缓存时,这都会激活信号。
这种方法易于实现,并且确实解决了我的查询问题。我愿意接受任何其他比这种方法更好的建议。