Connexion: [怀疑]启用CORS与连接

创建于 2016-12-02  ·  9评论  ·  资料来源: zalando/connexion

描述

我有一个带有一些jQuery的静态文件,可以访问用connexion构建的API。 不幸的是,浏览器要求启用CORS才能访问API。 我找不到将字段添加到标头响应的方法,也找不到模块或选项来执行此操作,所以我不确定该怎么做。

附加信息:

另一个可能的解决方法是,如果我只能在Connexion中使用此静态代码,我发现了很多Flask解决方案,但没有与Connexion一起工作的解决方案

命令输出:

  • python --version
    的Python 3.4.3
question

最有用的评论

@ernanirst ,您好-我相信您可以访问瓶的底层“ app”对象并以与使用Flask服务相同的方式启用CORS,如下所示:

import connexion
from connexion.resolver import RestyResolver
from flask_cors import CORS

app = connexion.App(__name__)
CORS(app.app)
app.add_api('api.yaml', resolver=RestyResolver('seaiceservices.api'))

所有9条评论

@ernanirst ,您好-我相信您可以访问瓶的底层“ app”对象并以与使用Flask服务相同的方式启用CORS,如下所示:

import connexion
from connexion.resolver import RestyResolver
from flask_cors import CORS

app = connexion.App(__name__)
CORS(app.app)
app.add_api('api.yaml', resolver=RestyResolver('seaiceservices.api'))

@ernanirst看到#50的答案/讨论,使用flask-cors对我来说足够好了。

重新打开,因为我们应该在http://connexion.readthedocs.io/en/latest/cookbook.html上添加有关CORS的部分

参见我的PR#358。

非常感谢,我尝试了一些非常相似的方法,但没有效果,但是效果很好。 我建议您将其添加到文档中,因为我在那儿没有发现任何东西。 再次感谢。

我正在尝试使用带有连接的烧瓶cors

#!/usr/bin/env python3

import config
import connexion
import logging
import logging.handlers
from connexion.resolver import RestyResolver
from flask.logging import default_handler
from flask_jwt_extended import JWTManager
from flask_cors import CORS

def create_app():
    app = connexion.FlaskApp(__name__, specification_dir='swagger/')
    app.add_api('mapmybook.yaml', validate_responses=True, strict_validation=True, resolver=RestyResolver('api'))

    app.app.config.from_object(config.DevelopmentConfig)
    app.app.logger.addHandler(create_file_handler())

    jwt = JWTManager(app.app)
    return app.app # return <Flask> object

def create_file_handler():
    ...
    return rfh

if __name__ == '__main__':
    app = create_app()
    CORS(app.app)
    app.run(port=5000)

但是当我发送请求时

curl 'http://127.0.0.1:5000/v1.0/login' -X OPTIONS -H 'Pragma: no-cache' -H 'Access-Control-Request-Method: POST' -H 'Origin: http://localhost:8080' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 OPR/56.0.3051.36' -H 'Accept: */*' -H 'Cache-Control: no-cache' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Access-Control-Request-Headers: content-type' --compressed

我懂了
Failed to load http://127.0.0.1:5000/v1.0/login: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access

我还需要设置什么才能使它与application / json内容类型一起使用?

只是在黑暗中的一击。 但是添加resources参数,例如:

...
CORS_RESOURCES = {r"/v1/*": {"origins": "*"}, r"/v1.0/*": {"origins": "*"}, r"/v1.1/*": {"origins": "*"}}
CORS(app.app, resources=CORS_RESOURCES)
...

似乎@cross_origin装饰器解决了问题,但仅CORS(app)无法正常工作。

仅供参考,对于简单的用例,您可以自己将所需的标头添加到所有响应中。 有两种方法可以实现此目的。

使用自定义中间件:

class CorsHeaderMiddleware(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        def custom_start_response(status, headers, exc_info=None):
            # append whatever headers you need here
            headers.append(('Access-Control-Allow-Origin', '*'))
            headers.append(
                ('Access-Control-Allow-Headers', 'X-Requested-With')
            )
            headers.append(('Access-Control-Allow-Methods', 'OPTIONS'))
            return start_response(status, headers, exc_info)

        return self.app(environ, custom_start_response)

connexion_app = connexion.FlaskApp(__name__, specification_dir='.')
connexion_app.add_api('specification.yml')
connexion_app.app.wsgi_app = CorsHeaderMiddleware(connexion_app.app.wsgi_app)

使用Flask的after_request钩子

def set_cors_headers_on_response(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Headers'] = 'X-Requested-With'
    response.headers['Access-Control-Allow-Methods'] = 'OPTIONS'
    return response

connexion_app = connexion.FlaskApp(__name__, specification_dir='.')
connexion_app.add_api('api_specification.yml')
connexion_app.app.after_request(set_cors_headers_on_response)

尽管Flask挂钩方法略短一些,但WSGI中间件仍将继续工作,即使稍后切换到tornadogevent等后端。

此页面是否有帮助?
0 / 5 - 0 等级