当前位置: 首页 > 知识库问答 >
问题:

Javascript-请求的资源上不存在“Access Control Allow Origin”标头

赵英范
2023-03-14

我需要发送数据通过XmlHttpRequest从JavaScript到Python服务器。因为我在使用localhost,所以我需要使用CORS。我正在使用Flask框架及其模块flask_cors

作为JavaScript,我有以下几点:

    var xmlhttp;
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    }
    else {// code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.open("POST", "http://localhost:5000/signin", true);
    var params = "email=" + email + "&password=" + password;


    xmlhttp.onreadystatechange = function() {//Call a function when the state changes.
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            alert(xmlhttp.responseText);
        }
    }
    xmlhttp.send(params);

和Python代码:

@app.route('/signin', methods=['POST'])
@cross_origin()
def sign_in():
    email = cgi.escape(request.values["email"])
    password = cgi.escape(request.values["password"])

但是当我执行它时,我会得到这样的信息:

XMLHttpRequest无法加载localhost:5000/signin.请求的资源上不存在访问控制允许起源标头。因此,不允许访问源'null'。

我该怎么修?我知道我需要使用一些“accesscontrolalloworigin”头,但我不知道如何在这段代码中实现它。顺便说一下,我需要使用纯JavaScript。

共有3个答案

冷宏茂
2023-03-14

通过使用这个装饰器,我获得了使用Flask的Javascript,并将“选项”添加到我的可接受方法列表中。应该在路线装饰器下面使用装饰器,如下所示:

@app.route('/login', methods=['POST', 'OPTIONS'])
@crossdomain(origin='*')
def login()
    ...

编辑:链接似乎已断开。这是我用过的装饰师。

from datetime import timedelta
from flask import make_response, request, current_app
from functools import update_wrapper

def crossdomain(origin=None, methods=None, headers=None, max_age=21600,
                attach_to_all=True, automatic_options=True):
    """Decorator function that allows crossdomain requests.
      Courtesy of
      https://blog.skyred.fi/articles/better-crossdomain-snippet-for-flask.html
    """
    if methods is not None:
        methods = ', '.join(sorted(x.upper() for x in methods))
    # use str instead of basestring if using Python 3.x
    if headers is not None and not isinstance(headers, basestring):
        headers = ', '.join(x.upper() for x in headers)
    # use str instead of basestring if using Python 3.x
    if not isinstance(origin, basestring):
        origin = ', '.join(origin)
    if isinstance(max_age, timedelta):
        max_age = max_age.total_seconds()

    def get_methods():
        """ Determines which methods are allowed
        """
        if methods is not None:
            return methods

        options_resp = current_app.make_default_options_response()
        return options_resp.headers['allow']

    def decorator(f):
        """The decorator function
        """
        def wrapped_function(*args, **kwargs):
            """Caries out the actual cross domain code
            """
            if automatic_options and request.method == 'OPTIONS':
                resp = current_app.make_default_options_response()
            else:
                resp = make_response(f(*args, **kwargs))
            if not attach_to_all and request.method != 'OPTIONS':
                return resp

            h = resp.headers
            h['Access-Control-Allow-Origin'] = origin
            h['Access-Control-Allow-Methods'] = get_methods()
            h['Access-Control-Max-Age'] = str(max_age)
            h['Access-Control-Allow-Credentials'] = 'true'
            h['Access-Control-Allow-Headers'] = \
                "Origin, X-Requested-With, Content-Type, Accept, Authorization"
            if headers is not None:
                h['Access-Control-Allow-Headers'] = headers
            return resp

        f.provide_automatic_options = False
        return update_wrapper(wrapped_function, f)
    return decorator
边桐
2023-03-14

老问题,但对于未来的谷歌用户有这个问题,我解决了它(和其他一些下游问题与CORS有关)为我的烧瓶restful应用程序通过添加以下内容到我的app.py文件

app = Flask(__name__)
api = Api(app)

@app.after_request
def after_request(response):
  response.headers.add('Access-Control-Allow-Origin', '*')
  response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
  response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
  return response


if __name__ == '__main__':
    app.run()
慎建本
2023-03-14

我已经使用了flask-cors扩展。

使用pip安装烧瓶cors安装

那就简单了

from flask_cors import CORS
app = Flask(__name__)
CORS(app)

这将允许所有域

 类似资料:
  • 我想访问来自同一个域但不同端口号的信息,为此我在响应头中添加了< code > Access-Control-Allow-Origin 。 Servlet Code:(现载于www.example.com:PORT_NUMBER) jQuery code:(存在于 www.example.com) 有几次我收到此错误(在控制台中): 此错误主要发生在第一次执行 时。第二次允许。 我的问题是或代码中

  • 但是我遇到以下错误 XMLHttpRequest无法加载http://www.google.com/.请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源' null'。

  • 我打关键斗篷apihttp://localhost:8080/auth/realms/**/协议/openid-connect/令牌与正确的凭据,它的工作正常,但与错误的凭据 当我添加跨域允许时,它会给我印前检查错误 任何人都可以帮我:)PS:使用CORS插件一切正常

  • 问题内容: 我是django的新手,并将其用作创建用户的应用程序的后端。在前端发布用户名的代码是: 在后端,与url相关的功能处理json,但我收到错误消息“请求的资源上没有’Access-Control-Allow-Origin’标头。 问题答案: 你的前端和后端位于不同的端口上,这意味着你的ajax请求受跨源安全性的约束。 你需要设置后端以接受来自不同来源(或只是不同端口号)的请求。

  • 问题内容: 我有一个在服务器上运行的API,并且有一个与之连接的前端客户端来检索数据。我对跨域问题进行了一些研究,并使其起作用。但是我不确定发生了什么变化。我现在在控制台中收到此错误: XMLHttpRequest无法加载https://api.mydomain/api/status。所请求的资源上没有“ Access-Control-Allow-Origin”标头。因此,不允许访问源“ http

  • 问题内容: 实际上,这不是 重复的 帖子,我知道在stackoverflow社区中多次问过的标题的一部分,我阅读了所有帖子和答案,但是我认为我使用的问题和技术是不同的。 首先,我应该提到的是我的后端应用程序,也是我的前端应用程序。 我读了一下,发现必须在App 上启用并放入 请求的标头,但是在调用api时仍然出现以下错误: 所请求的资源上没有“ Access-Control-Allow-Origi