简体   繁体   English

Django 会话在 Redis 实现后停止工作

[英]Django sessions stop working after Redis implementation

I Havve implemented redis using this link and after this session must bne stored in redis instaed of db.我已经使用此链接实现了 redis,并且在此会话之后必须存储在 db 的 redis 中。 After configuration when I restart my app .当我重新启动我的应用程序时配置后。 I am getting hey error for my sessions.我的会话出错了。

eg, Let say IN function A I declared a session and when I visit another link from browser and try to fetch same session in view the session is gone its not there.例如,假设 IN 函数A我声明了一个会话,当我从浏览器访问另一个链接并尝试获取相同的会话时,该会话已经消失了。 even no session keys exist .甚至不存在会话密钥。 request.session.keys() is blank. request.session.keys() 为空。

Here is my redis configuration:这是我的redis配置:

Cache server settings缓存服务器设置

REDIS_PROT = "redis://"
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
REDIS_DB = 0

REDIS_CACHE_SERVER = REDIS_PROT + REDIS_HOST + ":" + str(REDIS_PORT) + "/" + str(REDIS_DB)
REDIS_CACHEALOT_SERVER = REDIS_PROT + REDIS_HOST + ":" + str(REDIS_PORT) + "/" + str(REDIS_DB + 3)

DJANGO_REDIS_IGNORE_EXCEPTIONS = True

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": REDIS_CACHE_SERVER,
        "OPTIONS": {
            "PARSER_CLASS": "redis.connection.HiredisParser",
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "COMPRESS_MIN_LEN": 10,
            "SOCKET_CONNECT_TIMEOUT": 5,  # in seconds
            "SOCKET_TIMEOUT": 5,  # in seconds
        }
    },
    "cachealot": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": REDIS_CACHEALOT_SERVER,
        "OPTIONS": {
            "PARSER_CLASS": "redis.connection.HiredisParser",
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "COMPRESS_MIN_LEN": 10,
            "SOCKET_CONNECT_TIMEOUT": 5,  # in seconds
            "SOCKET_TIMEOUT": 5,  # in seconds
        }
    }
}

# CacheALot service settings 

CACHALOT_ENABLED = True
CACHALOT_CACHE   = 'cachealot'

# Django Redis Session App Configuration 

SESSION_REDIS_HOST = REDIS_HOST
SESSION_REDIS_PORT = REDIS_PORT
SESSION_REDIS_DB = REDIS_DB + 4
#SESSION_REDIS_PASSWORD = 'password'
SESSION_REDIS_PREFIX = 'session'

SESSION_ENGINE = 'redis_sessions.session'
# If you prefer domain socket connection, you can just add this line instead of SESSION_REDIS_HOST and SESSION_REDIS_PORT.
#SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH = '/var/run/redis/redis.sock'

# Celery Configurations
REDIS_CELERY_BROKER_SERVER =  REDIS_PROT + REDIS_HOST + ":" + str(REDIS_PORT) + "/" + str(REDIS_DB + 1)
REDIS_CELERY_RESULT_SERVER = REDIS_PROT + REDIS_HOST + ":" + str(REDIS_PORT) + "/" + str(REDIS_DB + 2)

BROKER_URL = REDIS_CELERY_BROKER_SERVER
CELERY_RESULT_BACKEND = REDIS_CELERY_RESULT_SERVER
CELERY_ALWAYS_EAGER=False

Any idea why I am getting key errors for django sessions.知道为什么我会收到 django 会话的关键错误。

Seems you're doing awfully much for simply enabling cached sessions.似乎您只是为了启用缓存会话做了很多工作。 Why are you also using django-redis-sessions , django-cachalot in addition to django-redis ?除了django-redis之外,您为什么还使用django-redis-sessionsdjango-cachalot

Let's simplify with a minimal config, that works for me, using only django-redis .让我们用一个对我有用的最小配置来简化,只使用django-redis I'm following their guide , and Django's documentation on setting up sessions and using cached sessions :我正在遵循他们的指南,以及关于设置会话使用缓存会话的Django 文档

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

That's it, test it by requesting a view and inspecting request.session or, if you're outside of request, using your session store :就是这样,通过请求视图和检查request.session测试它,或者,如果您在请求之外,使用您的会话存储

>>> from django.contrib.sessions.backends.cache import SessionStore
>>> s = SessionStore(session_key='ff882814010ccbc3c870523934fee5a2')
>>> s.save()
>>> s.session_key
'ff882814010ccbc3c870523934fee5a2'
>>> s.session_data
'KGRwMQpTJ19hdXRoX3VzZXJfaWQnCnAyCkkxCnMuMTExY2ZjODI2Yj...'
>>> s.get_decoded()
{'user_id': 42}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM