【问题标题】:Flask restful api enabling CORS is not working for remote ajax call启用 CORS 的 Flask restful api 不适用于远程 ajax 调用
【发布时间】:2015-05-08 19:10:52
【问题描述】:

我有一个烧瓶应用程序,其中有一个我试图通过远程服务器调用的 restful api。

初始化文件:-

from flask.ext import restful
from flask.ext.cors import CORS

app = create_app(__name__)
app.config['CORS_HEADERS'] = 'Content-Type'
cors = CORS(app, resorces={r'/d/<string:d_name>': {"origins": '*'}})
api=restful.Api(app)
api.add_resource(g_Api, '/g/<string:g_id>')
api.add_resource(d_Api, '/d/<string:d_name>')

现在是 d_Api 类:-

from flask import Flask, render_template, g
from flask.ext.restful import reqparse, abort, Api, Resource
    def abort_if_not_exist(d_name):
      return d_name

    class d_Api(Resource):
      def __init__(self):
        self.d=d

      def get(self, d_name):
        val=abort_if_not_exist(d_name)
        return val

这在同一个本地主机服务器上工作正常,返回正确的结果。 localhost 上运行的服务器对 api 进行了 ajax 调用,

$.ajax({
                                    async: false,
                                    type: 'GET',
                                    url: 'http://localhost:8080/d/'+d_name,
                  success: function(data) {
                                        alert(data);
                                        }
});

当从 remotehost 调用时不返回任何响应,而是在 Firefox 中我得到 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource d 。这可以通过将资源移动到同一域或启用 CORS 来解决。

Im not sure how else to configure CORS for this api endpoint. Im 使用 python 2.6 和“flask-cors”。

我发现了这个区别:当我尝试从本地主机访问 api 时 - 2015-03-09 11:40:35 - Flask-Cors:385 - INFO - CORS request from Origin:xyz-ld2.abc.biz:8080, setting Access-Control-Allow-Origin:* 当我尝试从远程主机访问 api 时:2015-03-09 11:47:15 - Flask-Cors:385 - INFO - CORS request from Origin:None, setting Access-Control-Allow-Origin:*

【问题讨论】:

标签: python ajax flask cors flask-restful


【解决方案1】:

问题在于资源定义,您只能对资源使用正则表达式 你需要这样的东西或任何其他有效的正则表达式:

cors = CORS(app, resorces={r'/d/*': {"origins": '*'}})

【讨论】:

  • 现在有什么问题?
  • 看到我更新了问题.. 当我尝试使用 jquery post 远程访问 api 时,我没有得到响应,但同样的错误,但是从浏览器它可以正常工作,即使是远程的。
【解决方案2】:

好的。问题是我正在使用

$.ajax({
                                    async: false,
                                    type: 'GET',
                                    url: 'http://localhost:8080/d/'+d_name,
                  success: function(data) {
                                        alert(data);
                                        }
});

Url 作为 localhost 这不是正确的方法。您应始终使用托管内容的 IP 或 VIP 或域地址。 例如:url : 'http:// xyz .com:8080/d'+d_name' 会起作用。对于 https:// 使用

url:"//xyz. com/d/d_name" i.e. without the protocol.

【讨论】:

    【解决方案3】:

    问题在于代码中的这条语句:

    cors = CORS(app, resorces={r'/d/&lt;string:d_name&gt;': {"origins": '*'}})

    来自文档:http://flask-cors.corydolphin.com/en/latest/api.html?highlight=origin#flask_cors.cross_origin

    flask_cors.cross_origin(*args, **kwargs) The origin, or list of origins to allow requests from. The origin(s) may be regular expressions, case-sensitive strings, or else an asterisk

    这里您需要提供RegEx;喜欢:

    cors = CORS(app, resorces={r'/d/*': {"origins": '*'}})

    这将在所有以/d/ 开头的路由上启用CORS

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 1970-01-01
      • 2018-02-04
      • 2021-02-08
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2021-12-16
      • 2021-10-02
      相关资源
      最近更新 更多