我有一个带有一些jQuery的静态文件,可以访问用connexion构建的API。 不幸的是,浏览器要求启用CORS才能访问API。 我找不到将字段添加到标头响应的方法,也找不到模块或选项来执行此操作,所以我不确定该怎么做。
另一个可能的解决方法是,如果我只能在Connexion中使用此静态代码,我发现了很多Flask解决方案,但没有与Connexion一起工作的解决方案
命令输出:
python --version
@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)
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中间件仍将继续工作,即使稍后切换到tornado
或gevent
等后端。
最有用的评论
@ernanirst ,您好-我相信您可以访问瓶的底层“ app”对象并以与使用Flask服务相同的方式启用CORS,如下所示: