2016-03-07 86 views
2

我已經使用此link實現了redis,並且在此會話之後必須存儲在redis instaed db中。配置完成後,重新啓動我的應用程序我正在爲我的會話收到嗨錯誤。在Redis執行後Django會話停止工作

例如, 讓我們說IN函數A我聲明瞭一個會話,並且當我從瀏覽器訪問另一個鏈接並嘗試在視圖中獲取同一會話時,會話不在其中。甚至不存在會話密鑰。 request.session.keys()爲空。

這裏是我的Redis的配置:

緩存服務器設置

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 

任何想法,爲什麼我收到鍵錯誤Django的會話。

回答

1

似乎你只是簡單地啓用緩存會話做得非常好。除了django-redis之外,你爲什麼還使用django-redis-sessionsdjango-cachalot

讓我們用最小的配置進行簡化,這對我很有用,僅使用django-redis。我下面their guideDjango's documentation on setting up sessionsusing cached sessions

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' 

就是這樣,通過請求查看和檢查request.session或測試,如果你outside of request, using your session store

>>> 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} 
+1

的問題,因爲它的會話沒有工作被下面的設置是在設置文件爲兒子設置爲我改變他們爲False,一切似乎是工作文件: 'CSRF_COOKIE_SECURE =真 SESSION_COOKIE_SECURE = TRUE; – user5594493

+1

d idn't你知道你改變了默認[對於這些](https://docs.djangoproject.com/en/1.9/ref/settings/#csrf-cookie-secure)(這是'False');無論如何,我上面提出的解決方案(使用最小配置)仍然是正確的。如果你願意,你可以[參考這個問題](http://stackoverflow.com/q/22430903/484127)瞭解爲什麼這兩個設置會影響你的設置。 – tutuDajuju

+1

'SECURE_PROXY_SSL_HEADER'在實際服務器上啓用,但在本地不起作用,因爲https不能在本地工作,我從本地刪除安全設置,但忘記了會話和cookie設置。無論如何,多謝告訴他們爲什麼發生衝突 – user5594493