Django Angular cors错误:不允许访问控制允许来源

Posted

技术标签:

【中文标题】Django Angular cors错误:不允许访问控制允许来源【英文标题】:Django Angular cors error: access-control-allow-origin not allowed 【发布时间】:2017-12-28 14:41:03 【问题描述】:

我已经使用 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);
  

但它给了我:Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers in preflight response. 虽然我包括 withCredentials。

我做错了什么?

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

【问题讨论】:

【参考方案1】:

删除这一行,

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

来自您的 getTasks() 函数。您无需为服务器指定这些选项。 django-cors-headers 负责处理。

【讨论】:

它确实有效,但究竟为什么呢?我以前总是用来添加标题和凭据! Django 拒绝标头中带有Access-Control-Allow-Origin 选项的任何请求。您无需明确提供。 客户端发送一个 Access-Control-Request-Headers 来请求允许某些标头,服务器返回一个 Access-Control-Allow-Headers ,其中列出了它要允许的实际标头。客户端不会要求允许哪些标头。 好的,我现在明白了 :) 感谢您的解释! 您能帮我一个忙,然后将答案标记为选中吗?

以上是关于Django Angular cors错误:不允许访问控制允许来源的主要内容,如果未能解决你的问题,请参考以下文章

Angular 7:发送 post 请求给出错误 405(不允许的方法)

Django CORS 问题:不允许访问控制允许来源

Django CORS 请求外部重定向不允许

Angular cors 从 django rest 框架后端获取数据并获得许可

如何使用 Angular 7 在 django1.1 中启用 cors?

Angular从客户端避免CORS问题