为什么django在数据库中创建了很多会话对象?

时间:2013-03-18 16:09:40

标签: django django-sessions

我有一个名为'app'的应用程序的vanilla django项目。它有views.py和middleweres.py。

#views.py
from django.http.response import HttpResponse

def home(request):
    return HttpResponse('')

#settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'app.middlewares.M',
)

#middlewares.py
class M(object):
    def process_request(self, request):
        request.session['a']='a'

Django在每次请求时都在db中为会话表添加一行。为什么呢?

UPD:我还是很困惑。我为这个问题制作了一个github项目:https://github.com/vinograd19/django-session-problem/ 你可以在那里找到我的代码并在你的机器上运行

2 个答案:

答案 0 :(得分:4)

您的自定义中间件M正在修改每个请求(Writing your own middleware)上的会话字典:

  在Django决定执行哪个视图之前,会在每个请求上调用process_request()。

即使您在每个请求上修改会话,每个用户应该只有一行(同一浏览器上的同一个访问者)。如果同一访问者发出多个请求,则每个请求都应该更新相应的会话行(因为您的中间件'M')。不会为同一个访问者创建额外的行,但会在新访问者访问您的网站时创建新行。来自Django docs:

  

考虑数据库后端会发生什么。当用户登录时,Django会在django_session数据库表中添加一行。每次会话数据更改时,Django都会更新此行。如果用户手动注销,Django将删除该行。但是如果用户没有注销,则该行永远不会被删除。文件后端也会发生类似的过程。

如果您在数据库会话表中找到了很多行,那么您可能已经过期了需要清除的会话(Clearing the session store

  

Django不提供自动清除过期的会话。因此,您的工作是定期清除过期的会话。 Django为此提供了一个清理管理命令:clearsessions。建议定期调用此命令,例如作为每日cron作业。

在这种情况下,您应该拨打clearsessions command

django-admin.py clearsessions

您应该设置一个cron作业来定期调用此命令并清除过期的会话。

答案 1 :(得分:1)

来自docs

  

保存会话时

     

默认情况下,Django仅保存到会话中   修改会话时的数据库 - 即它是否为任何一个   字典值已分配或删除: