如何创建在Django中登录时设置会话变量的中间件?

如何创建在Django中登录时设置会话变量的中间件?,django,session,login,session-variables,middleware,Django,Session,Login,Session Variables,Middleware,正如问题所说,我想在用户登录时为用户会话设置一些变量,并在注销或浏览器关闭时删除此变量 最初我想写我的自定义登录视图来实现这一点,但可能中间件是一个更好的解决方案。在阅读了所有关于您的问题的评论后,我也会在@akhil viswam的最后评论中说同样的话 但是现在您已经指定您确实想要执行一些自定义任务,那么您可以像这样编写自己的自定义中间件-> 然后将其包括在您的settings.py中,如下-> 基本上,我是在Redis中编写user\u id:session\u id键值对,然后在我的视图中

正如问题所说,我想在用户登录时为用户会话设置一些变量,并在注销或浏览器关闭时删除此变量


最初我想写我的自定义登录视图来实现这一点,但可能中间件是一个更好的解决方案。

在阅读了所有关于您的问题的评论后,我也会在@akhil viswam的最后评论中说同样的话

但是现在您已经指定您确实想要执行一些自定义任务,那么您可以像这样编写自己的自定义中间件->

然后将其包括在您的settings.py中,如下->

基本上,我是在Redis中编写user\u id:session\u id键值对,然后在我的视图中读取它们以显示实时通知,但只显示给登录的用户


我希望这会让您对如何编写自己的自定义中间件有一个公平的认识。

中间件不是实现解决方案的正确方法。我发现了这些信号,并以这种方式实施了我的解决方案:

@receiver(user_logged_in)
def sig_user_logged_in(sender, user, request, **kwargs):
    moderator = get_or_none(CompanyModerator, moderator__user=request.user)
    if moderator:
        if 'company_id' not in request.session:
            request.session['company_id'] = moderator.company.id
区别在于,每个django请求都会触发一个中间件,当用户登录/注销时需要做一些事情。每次用户登录/注销时,我们都会添加一些数据/对象模型等。。到会话以跟踪网站上的所有用户


你觉得怎么样?

答案是关于将变量设置为会话,我的问题与中间件有关@AK感谢对一个有用的问题django have default session中间件的否决票。那么为什么您需要使用另一个呢?因此,您的解决方案是继承/重写django auth登录视图,只需添加此变量,对注销执行同样的操作以删除它,而不是创建一个中间件来根据用户执行某些业务逻辑?如果您只是想使用会话,请使用django会话中间件。如果您需要执行某些自定义任务,也可以使用您自己的自定义中间件