2

我有一个带有名为 'app' 的应用程序的香草 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/ 你可以在那里找到我的代码并在你的机器上运行它

4

2 回答 2

4

您的自定义中间件 M 正在修改每个请求的会话字典(编写您自己的中间件):

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

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

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

如果您在DB 会话表中发现了很多行,那么您可能有需要清除的过期会话(清除会话存储

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

在这种情况下,您应该调用clearsessions 命令

django-admin.py clearsessions

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

于 2013-03-27T11:59:24.540 回答
1

文档

保存会话时

默认情况下,Django 仅在会话被修改时才保存到会话数据库中——也就是说,如果它的任何字典值已被分配或删除:

于 2013-03-18T16:42:26.637 回答