javascript - 即使 REST 服务器设置 header ,访问控制允许来源错误

标签 javascript python ajax flask cors

我正在尝试了解 REST 服务器和托管 Flask 服务器。

在我得到的服务器网址上运行curl:

HTTP/1.1 200 OK
Access-Control-Allow-Methods: POST, OPTIONS, GET, HEAD
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 21600
Content-Type: text/html; charset=utf-8
Date: Sat, 28 Jun 2014 07:08:41 GMT
Server: gunicorn/19.0.0
Content-Length: 36
Connection: keep-alive

但是当我尝试从另一个网址访问其中的数据时,我得到:

XMLHttpRequest cannot load --server url--. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin --page url-- is therefore not allowed access.

到目前为止我尝试过以下代码来获取数据:

  var formData = new FormData();
  formData.append("name",username );
  formData.append("id", userid);

  var request = new XMLHttpRequest();
  request.open("POST", "my-server-url");
  request.send(formData);
  console.log("Running Create user")
  console.log("Status: "+request.status);
  console.log("error: "+request.error);
  console.log("responseText: "+request.responseText);

返回

Running Create user
Status: 0
error: undefined
responseText: 

我尝试过使用 ajax 和 jquery,但也失败并出现与上述相同的错误

  $.ajax({  
            url:'--server url--',  
            type:'POST',
            data :  mydata,      
            dataType: 'JSON',
            success: function(data) { 
                  console.log(data)   
            }  
        }); 

还有

  $.ajax({  
                url:'--server url--',  
                type:'POST',
                data :  mydata,      
                dataType: 'JSONP',
                async: false,
                success: function(data) { 
                      console.log(data)   
                }  
            }); 

我正在使用crossdomain decorator snippet在Python代码中。

有关我的服务器路由处理的示例:

@app.route("/",  methods=['POST', 'GET', 'OPTIONS'])
@crossdomain(origin='*')
def create():
    if request.method == 'POST':
        name = request.form['name']
        id = request.form['id']
        #duplicate = collection.find_one({'name': name, 'token': token})
        duplicate = collection.find_one({'id': id})
        if not duplicate:
            data = {'name': name,
                    'id': id}
            collection.insert(data, safe=True)
            response= make_response({'status': 'created'}, 201)
            response.headers['Access-Control-Allow-Origin'] = "*"
            return response 
        else:
            response= make_response({'status': 'already exists'}, 302)
            response.headers['Access-Control-Allow-Origin'] = "*"
            return response

最佳答案

我终于成功解决了这个问题,我对ajax代码做了以下更改

var formData = new FormData();
formData.append("id", userid); 
$.ajax({
            url: '--server--',
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false,
            success: function(data){
              //do something with data
              console.log(data)
            },
            error: function(e) {
                    //handle error
                    console.log(e)
                  }


          })

我也必须在服务器上进行此更改:

@app.route("/",  methods=['POST', 'GET', 'OPTIONS'])
@crossdomain(origin='*')
def create():
    if request.method == 'POST':
        name = request.form['name']
        id = request.form['id']
        #duplicate = collection.find_one({'name': name, 'token': token})
        duplicate = collection.find_one({'id': id})
        if not duplicate:
            data = {'name': name,
                    'id': id}
            collection.insert(data, safe=True)
            return jsonify({'status': 'created'}), 201
        else:
            return jsonify({'status': 'already exits'}), 302

关于javascript - 即使 REST 服务器设置 header ,访问控制允许来源错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24464753/

相关文章:

python - 使用 python-docx 使表格中的单元格变粗

javascript - 如何从异步调用返回响应?

javascript - Ajax 请求支持 Android

javascript - 两个 Ajax onclick 事件

javascript - 如何更改或伪装地址栏网址?

javascript - Flask 和 JavaScript 删除前确认

javascript - React setState 函数的小问题

JavaScript:删除 DOM 中的所有 iframe

python - 有没有办法让 tkinter 中的网格居中?

python - Lotka Volterra 和 Runge Kutta 不需要精确度