获取'AnonymousUser'对象与DRF没有属性'属性'异常

时间:2015-09-16 05:02:47

标签: django authentication django-rest-framework csrf

我刚刚更改为远程服务器的新域,该域已经通过Django Rest Framework(2.4.x)提供JSON。

在更改之前,它可以顺利地对用户进行身份验证。但是,在切换之后,它现在抛出了标题中提到的错误。

感觉像CSRF的东西,但我不知道要修复什么,或者在哪里侦探。

指针?

修改

回溯:

Traceback (most recent call last):
File ".../project_path/project_name/urls.py", line 584, in list
related_field = self.request.user.relatedfield
AttributeError: 'AnonymousUser' object has no attribute 'relatedfield'

DRF设置:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
    ),
    'PAGINATE_BY': 10,                 # Default to 10
    'PAGINATE_BY_PARAM': 'page_size',  # Allow client to override, using `?page_size=xxx`.
    'MAX_PAGINATE_BY': 999             # Maximum limit allowed when using `?page_size=xxx`.
}

2 个答案:

答案 0 :(得分:1)

我认为,由于您是从其他域发出请求,因此身份验证无法正常运行。

由于您使用SessionAuthentication,因此强制使用CSRF token,CSRF检查的全部目的是避免跨网站请求伪造。

答案 1 :(得分:1)

此库有助于跨网站域请求django-cors-headers。 cors-headers应用会将Cross-Origin Resource Sharing headers添加到回复中。阅读CORS机制。

CORS_ALLOW_HEADERS:指定在发出实际请求时可以使用哪些非标准HTTP标头

settings.py

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)
MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)
CORS_ALLOW_HEADERS = (
        'x-requested-with',
        'content-type',
        'accept',
        'origin',
        'authorization',
        'x-csrftoken'
    )