在请求完成之前删除了请求的会话.例如,用户可能已在并发请求中注销

kar*_*sss 12 python django

我有一个Python/Django应用程序,有时有超过100个用户登录.有一天,我在Django错误日志中找到了这个:

The request's session was deleted before the request completed. 
The user may have logged out in a concurrent request, for example.
Run Code Online (Sandbox Code Playgroud)

虽然这封信是用非常容易理解的英文写成的,但我不知道

  • 究竟发生了什么
  • 为什么会这样
  • 我是否需要担心它
  • 如果是的话,我该怎样才能防止这种情况再次发生

我找到了一个几乎相同标题的问题但不同之处在于我在设置中没有任何关于缓存的信息.

如果您需要任何代码,请在评论中告诉我.

谢谢你的时间!

sol*_*oke 13

实际发生的事情:当同一用户使用相同的会话密钥发出请求时,用户的会话被销毁(即,他们已注销,或会话已过期).

发生的原因:例如,如果用户打开了两个选项卡,并在其中一个选项卡中注销,而另一个选项卡也发出了请求,则可能会发生这种情况.如果两者都快速连续发生,那么就会遇到这个错误.

你需要担心吗?:除非你在日志中看到很多这样的事件,否则会出现问题.如果您只发现一次错误,则无需担心.

  • 如何避免在日志中出现此错误?如何捕捉它,有时我会收到django的电子邮件,说...这在1个月内发生了两次 (2认同)

jer*_*ady 9

这也可能发生,因为您将会话存储在虚拟缓存后端中。

例如:

如果您已将“ DummyCache”配置为默认缓存系统,或者您有SESSION_CACHE_ALIAS指向虚拟缓存的点,则即使在您的请求响应周期之间,这些会话数据也有可能被删除。也就是说,您的请求已到达 Djagno 服务器并正在积极处理中。

问题

settings似乎处于任何这种可能的配置中。

案例一:

# Possible Current Configuration 
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        'LOCATION': 'unique-snowflake',
     }
}

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
Run Code Online (Sandbox Code Playgroud)

或者

# Another Possible Current Configuration 
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
              "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    'cache_backend_for_user_session': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        'LOCATION': 'unique-snowflake',
    }
}

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "cache_backend_for_user_session"
Run Code Online (Sandbox Code Playgroud)

解决方案

我希望,现在你得到了解决方案,如果会话引擎依赖于缓存,最好不要将它们指向DummyCache.

您可以将SESSION_ENGINE缓存与任何其他缓存结合使用

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"  # or comfortabley anything else
CACHES = {
    'default': {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
              "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

(Redis 是我的首选配置;您可以使用django.core.cache.backends.locmem.LocMemCachedjango.core.cache.backends.memcached.MemcachedCache或任何其他选项。或者,如果您仍想使用,甚至可以将会话引擎从缓存更改为其他类似的内容DummyCache

# File Based
SESSION_ENGINE = "django.contrib.sessions.backends.file"

# Works In Combination With  Current Cache and Database, fairly persistant
SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"   

# Cookie Based, Browser Clearing Will lose it. 
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"  
Run Code Online (Sandbox Code Playgroud)

  • 多谢。```SESSION_ENGINE = "django.contrib.sessions.backends.cache"``` 这行有帮助。 (4认同)