经过身份验证的会话中的请求有时由AnonymousUser在Django中发送

时间:2017-04-01 10:16:20

标签: python django session anonymous-users

我在 nginx 代理后面的 gunicorn 上运行的django应用程序。

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

我使用 @login_required 装饰器来处理SPA中使用的所有功能。

在使用该应用程序时,一个随机函数调用突然以AnonymousUser 的形式发送,因此@login_required装饰器不起作用,因此我注销了该用户,或显示错误。

我使用自定义用户个人资料,会话引擎为 cached_db ,由 memcached &运行 pgbouncer

后面的 postgresql

我的身份验证相关设置如下: 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发送。这真的很奇怪..

1 个答案:

答案 0 :(得分: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。

我不知道为什么会发生这种情况,但是当我删除了语言环境时,它运行正常。