Django:有什么方法可以避免在每次请求时查询request.user吗?

Con*_*ion 9 django django-authentication django-sessions

对于我的网站,几乎每个页面都有一个标题栏显示"欢迎,ABC",其中"ABC"是用户名.这意味着request.user将为每一个请求调用,导致数据库一次又一次地命中.

但是一旦用户登录,我应该能够将他的user实例存储在他的cookie中并加密它.这样我可以避免重复访问数据库,而只是request.user从cookie中检索.

你会如何修改Django来做到这一点?是否有任何Django插件可以满足我的需求?

谢谢

Dan*_*man 7

这有过度优化的味道。从数据库中获取用户是每个请求的一次点击,如果您也使用 Profile 模型,则可能是两次。如果您的网站是这样的,额外的两个查询会对性能产生很大的影响,那么您可能会遇到更大的问题。

  • 不太确定这是过度优化。对于为超过 100 万用户设计的网站。我认为尽可能避免数据库命中是件好事。特别是在这里,这样做并不昂贵。 (2认同)

zee*_*kay 6

您想要使用会话中间件,并且需要阅读文档。会话中间件支持多种会话引擎。理想情况下,您可以使用 memcached 或 redis,但您可以编写自己的会话引擎来将所有数据存储在用户的 cookie 中。启用中间件后,它就可以作为请求对象的一部分使用。您与 进行交互request.session,它的作用就像一个字典,使其易于使用。以下是文档中的几个示例:

\n\n

这个简单的视图在用户发表评论后将 has_commented 变量设置为 True。它不允许用户多次发表评论:

\n\n
def post_comment(request, new_comment):\n    if request.session.get(\'has_commented\', False):\n        return HttpResponse("You\'ve already commented.")\n    c = comments.Comment(comment=new_comment)\n    c.save()\n    request.session[\'has_commented\'] = True\n    return HttpResponse(\'Thanks for your comment!\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个简单的视图记录了网站的“成员”:

\n\n
def login(request):\n    m = Member.objects.get(username=request.POST[\'username\'])\n    if m.password == request.POST[\'password\']:\n        request.session[\'member_id\'] = m.id\n        return HttpResponse("You\'re logged in.")\n    else:\n        return HttpResponse("Your username and password didn\'t match.")\n
Run Code Online (Sandbox Code Playgroud)\n