因此,angular2:origin'http:// localhost:3000'不允许访问

时间:2016-11-06 13:56:46

标签: django angular

我有一个django后端,我启用了Cross origin请求,如下所示:

INSTALLED_APPS = [
    ..
    'corsheaders',

]
MIDDLEWARE = [
    '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',
    'django.middleware.security.SecurityMiddleware',
    'corsheaders.middleware.CorsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True

我没有实施任何身份验证。我只是试图点击一个API端点并尝试在我的Angular2前端获取数据。

我在Django后端实现了一个基于会话的购物车,用于存储我的产品(https://github.com/lazybird/django-carton)。当我通过可浏览的api点击http://127.0.0.1:8000/api/shopping-cart/show/时,它给了我

{"1":{"product_pk":1,"price":"23000.00000","quantity":3},"2":{"product_pk":2,"price":"34000.00000","quantity":7},"4":{"product_pk":4,"price":"450.00000","quantity":1}} 

然而,当我尝试从我的Angular2服务中获取相同的URL时:它会引发错误:

XMLHttpRequest cannot load http://127.0.0.1:8000/api/shopping-cart/show/. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:3000' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.

我的服务电话如下:

 private myUrl: string = 'http://127.0.0.1:8000/api/shopping-cart/'
    showCart(){

            return this.http.get(this.myUrl + 'show' + '/', {withCredentials:true})
            .toPromise()
            .then(response => response.json())

        }

注意:如果我删除{withCredentials:true},则它不会发送sessionid或csrftoken并返回{}但错误消失。我做错了什么?

4 个答案:

答案 0 :(得分:1)

在我的Django设置中,我必须添加:

CORS_ALLOW_CREDENTIALS= True

答案 1 :(得分:0)

AFAIK如果您使用withCredentials: true,则无法将*用于Access-Control-Allow-Origin,但需要使用http://localhost:3000

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Origin

  

Access-Control-Allow-Origin: <origin> | *
  origin参数指定可以访问资源的URI。浏览器必须强制执行此操作。对于没有凭据的请求,服务器可以将“*”指定为通配符,从而允许任何源访问资源。

答案 2 :(得分:0)

您的中间件订单问题。试试这个

library(dplyr)
df1 %>%
    group_by(grp =cumsum(c(TRUE, diff(chamber)< 0)) ) %>%
    mutate(cycle = format(first(date), "%Y%m%d%H%M")) %>%
    ungroup() %>%
    select(-grp)

请注意,CorsMiddleware需要在Django的CommonMiddleware

之前出现

答案 3 :(得分:0)

您可以使用angular2集成代理。

  1. 创建proxy.conf.json文件
  2. proxy.conf中的
  3. 写道:

    {   “/ api / shopping-cart /”:{     “目标”:“http://localhost:8000”,     “安全”:错误   } }

  4. 你的package.json中的
  5. 将“start”脚本更改为:     “start”:“ng serve --proxy-config proxy.conf.json”

  6. 在命令行中运行“npm start”