2017-04-01 35 views
0

送我已经运行在gunicorn背后nginx的代理Django应用程序。的请求有时AnonymousUser在Django

当用户登录时,我将它们重定向到由Angular开发的单个页面应用程序。

我正在使用@login_required修饰器适用于SPA中使用的所有功能。

在使用应用程序,一个随机函数调用突然被作为AnonymousUser,所以@login_required装饰不工作,所以我注销用户,或显示错误。

我使用的是自定义的用户配置文件,以会议发动机作为cached_db运行由memcached的 & PostgreSQL的背后pgbouncer

我的身份验证相关设置如下: PS:get_env_variable( )函数从OS环境获取变量。

AUTH_USER_MODEL = 'main.User' 
AUTH_PROFILE_MODULE = 'main.User' 
INSTALLED_APPS = [ 
    'django.contrib.auth', 
    'django.contrib.sessions', 
    *** 
] 

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

#Sessions 
SESSION_SAVE_EVERY_REQUEST = True 
SESSION_COOKIE_NAME = 'sesid' 
SESSION_COOKIE_PATH = '/' 
SESSION_COOKIE_DOMAIN = 'domain.com' 
SESSION_COOKIE_SECURE = True 
SESSION_COOKIE_AGE = 1800 
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' 
CSRF_COOKIE_NAME = 'csrftkn' 
CSRF_COOKIE_PATH = '/' 
CSRF_COOKIE_SECURE = True 
CSRF_COOKIE_HTTPONLY = True 
CSRF_COOKIE_DOMAIN = 'domain.com' 
CSRF_COOKIE_AGE = 1800 
CSRF_TRUSTED_ORIGINS = ['domain.com'] 
SECURE_CONTENT_TYPE_NOSNIFF = True 
SECURE_BROWSER_XSS_FILTER = True 
X_FRAME_OPTIONS = "SAMEORIGIN" 
DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': get_env_variable("DATABASE_NAME"), 
     'USER': get_env_variable("DATABASE_USER"), 
     'PASSWORD': get_env_variable("DATABASE_PASSWORD"), 
     'HOST': get_env_variable("DATABASE_HOST"), 
     'PORT' : get_env_variable("DATABASE_PORT"), 
     'CONN_MAX_AGE': None, 
     'OPTIONS': { 
      'sslmode': 'verify-full', 
     } 
    } 
} 
CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 
     'LOCATION': "127.0.0.1:11211", 
    } 
} 

有趣的是,我正在使用另一个Django应用程序的相同设置,这是完美的。 Django作为AnonymousUser发送一个请求的原因是什么?我从来没有见过这个..

另外,如果我删除@login_required修饰,下一个函数调用发送为登录用户。因此,15-20个请求中的1个作为AnonymousUser发送。这真是奇怪..

回答

0

我的哨兵日志显示出一个奇怪的问题是,

DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0xdd in position 12: invalid continuation byte. You passed in 'HTTP_CONNECT\xddON' (<type 'str'> 

当我在挖的情况,事实证明,在我的一个功能,我使用的语言环境和区域设置为tr_TR。设置区域设置之后,请求标头将从HTTP_CONNECTION转换为HTTP_CONNECT \ xddON,这将混淆请求并将请求用户转换为AnonymousUser。

我不知道为什么会发生这种情况,但是当我删除语言环境时,它的工作原理非常完美。