我有一个名为'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/ 你可以在那里找到我的代码并在你的机器上运行答案 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仅保存到会话中 修改会话时的数据库 - 即它是否为任何一个 字典值已分配或删除: