如何使用 Flask-Restless 启用 CORS

Posted

技术标签:

【中文标题】如何使用 Flask-Restless 启用 CORS【英文标题】:How to enable CORS with Flask-Restless 【发布时间】:2015-04-26 06:17:23 【问题描述】:

我有一个使用 Flask-Restless 创建并使用 Apache 提供服务的 postgres 数据库的 API。

在我收到多个似乎与 OPTIONS 请求密切相关的“CORS 错误 Access-Control-Allow-Origin”标头时尝试使用基于 javascript 的前端访问 API 之前,该 API 运行良好。

我尝试了以下修复

[1.在 apache 中启用 cors][1]

 <VirtualHost *:80>
            Header add Access-Control-Allow-Origin "*"
            Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, Authorization"
            Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
            ServerName localhost
            WSGIScriptAlias / /home/drmclean/bboxx/git/Smart-Solar-Server/SmartSolarServer.wsgi
            WSGIScriptReloading On

            <Directory /home/drmclean/bboxx/git/Smart-Solar-Server/>
                    Header add Access-Control-Allow-Origin "*"
                    Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, Authorization"
                    Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
                    Require all granted
                    Order allow,deny
                    Allow from all
            </Directory>

            Alias /docs /home/drmclean/bboxx/git/Smart-Solar-Server/swagger
            <Directory /home/drmclean/bboxx/git/Smart-Solar-Server/swagger/>
                    Header add Access-Control-Allow-Origin "*"
                    Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, Authorization"
                    Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
                    Require all granted
                    Header set Access-Control-Allow-Origin "*"
                    Order allow,deny
                    Allow from all
            </Directory>
            ErrorLog $APACHE_LOG_DIR/error.log
            LogLevel warn
            CustomLog $APACHE_LOG_DIR/access.log combined
            <IfModule mod_rewrite.c>
                    RewriteEngine on
                    # Pass Authorization headers to an environment variable
                    RewriteCond %HTTP:Authorization ^(.*)
                    RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
            </IfModule>

2.Enable CORS using the flask-cors extension

app = Flask(__name__, static_folder= paths.base_path+'/swagger/')
cors = CORS(app)

3.使用flask-restless启用CORS

def allow_control_headers(response):
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Credentials'] = 'true'
return response

bp = manager.create_api(REDACTED)
bp.after_request(allow_control_headers)

不用说,到目前为止还没有任何工作。

    不删除 CORS 警告。 似乎删除了某些端点的 CORS 错误,但没有删除其他端点,将其更改为 cors = CORS(app, response=r"/v1/*") 带回了最初已删除的 CORS 错误。 尽管我直接从文档中复制了语法,但由于“bp 没有属性 after_request”而引发了语法错误。 (here)

谁能解释一下,

    为什么上述修复没有消除 CORS 问题。 如何解决我的问题并有效地启用跨域资源共享?

【问题讨论】:

我似乎已经通过使用选项 2 “修复”了一些问题。 cors = CORS(app, allow_headers = [Authorization]) 我不确定为什么这是必要的以及我在做什么以前错了吗? 【参考方案1】:

选项 3 最接近,但您参考的文档仅适用于特定版本的 Flask Restless,它不是最新的。我建议将Flask's after_this_request processor 与 Flask Restless 的预处理器结合使用

def allow_control_headers(**kw):

    @after_this_request
    def add_headers(response):
        response.headers['Access-Control-Allow-Origin'] = '*'
        response.headers['Access-Control-Allow-Credentials'] = 'true'
        return response

bp = manager.create_api(
  ...
  'preprocessors: 'GET_SINGLE': [allow_control_headers]
  ...
)

【讨论】:

以上是关于如何使用 Flask-Restless 启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

Flask-Restless:manager.create_api() 不返回蓝图对象

如何查询使用 Flask-restless 设置的 API

如何使用 Flask-Restless 按日期搜索模型

如何在 Flask-RESTless 中使用关键字参数

如何使用 terraform gke 模块启用 gce_persistent_disk_csi_driver_config

使用请求时如何为 Flask-Restless 构建复杂的过滤器?