Django Angular跨域错误:access-control-allow-origin不允许。

7
我使用django-rest-auth在我的Django应用程序中实现了身份验证。我的settings.py文件中的设置如下:
ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework.authtoken',
    'rest_auth',
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'rest_auth.registration',
    'corsheaders',
    'rest_framework_docs',
    'tasks'
]

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

ROOT_URLCONF = 'urls'
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
ALLOWED_HOSTS = ['*']

SITE_ID = 1

我从前端登录-我收到了一个令牌,我已经将其存储在本地存储中。现在我正在进行一个简单的GET请求,如下所示:

  getTasks(): Observable<Task[]> {

    let headers = new Headers({ 'Access-Control-Allow-Origin': '*' });
    let options = new RequestOptions({ headers: headers, withCredentials: true  });

    return this.http.get(this.taskUrl, options)
    .map(this.extractData)
    .catch(this.handleError);
  }

但是当我加上withCredentials时,会提示:请求头字段Access-Control-Allow-Origin不被允许由预检请求的Access-Control-Allow-Headers。

我做错了什么?

:如果我从POST中删除选项,则没有错误,但我会收到不正确的数据,因为我的后端返回特定用户的数据。

1个回答

8

移除这行代码,

let headers = new Headers({ 'Access-Control-Allow-Origin': '*' });

从您的getTasks()函数中发送请求时,无需向服务器指定那些选项。django-cors-headers会自动处理。

它确实起作用了,但为什么呢?我以前总是在添加头部和凭据之前这样做! - Thinker
1
Django拒绝任何在头部带有Access-Control-Allow-Origin选项的请求。您不需要显式提供它。 - zaidfazil
2
客户端发送Access-Control-Request-Headers请求允许某些标头,服务器回复Access-Control-Allow-Headers列出实际允许的标头。客户端无法要求允许哪些标头。 - zaidfazil
好的,我现在明白了 :) 谢谢你的解释! - Thinker
你能帮我一个忙吗?把答案标记为已选择的吗? - zaidfazil
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接