6

我过去Falcon CORS只允许从多个域访问我的 Web 服务。但它不能正常工作。

让我解释一下,如果我们看一下我的实现:

ALLOWED_ORIGINS = ['*']
crossdomain_origin = CORS(allow_origins_list=[ALLOWED_ORIGINS], log_level='DEBUG')

app = falcon.API(middleware=[RequireJSON(), JSONTranslator(), cors.middleware])

当我向我的 API 服务发出任何发布请求时,我会收到以下警告:

不允许由于来源而中止响应

但是,然后我从我的 API 中得到了正确的响应。
这是关于这个模块的官方文档:https ://github.com/lwcolton/falcon-cors

4

4 回答 4

6

您的代码与 falcon-cors 文档的示例不匹配:

import falcon
from falcon_cors import CORS    
cors = CORS(allow_origins_list=['http://test.com:8080'])    
api = falcon.API(middleware=[cors.middleware])
#                            ^^^^^^^^^^^^^^^

请注意,cors.middleware变量被传递到 api 调用中。在您的代码中,您正在创建crossdomain_origin但未将其传递到 API 设置中。

如果这不能解决问题,请提供一个工作代码示例,包括 Falcon 资源类,它易于测试和重现,我很乐意提供帮助。

编辑:

从下面的评论中,听起来 falcon-cors 工作正常,而问题可能是origin请求中省略了标头。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

Origin 标头指示跨站点访问请求或预检请求的来源。

于 2016-12-20T17:24:21.147 回答
4

在 github 上按照 lwcolton 的指导尝试了这里

并设置allow_all_headers=True, allow_all_methods=True

即与@Ryan评论相同

from falcon_cors import CORS

cors = CORS(
    allow_all_origins=True,
    allow_all_headers=True,
    allow_all_methods=True,
)

api = falcon.API(middleware=[cors.middleware])
于 2020-02-03T09:17:42.133 回答
1

还有另一种方法可以在不使用falcon-cors的情况下实现这一点

您可能想在官方文档中查看此内容 - how-do-i-implement-cors-with-falcon

class CORSComponent:

    def process_response(self, req, resp, resource, req_succeeded):
        resp.set_header('Access-Control-Allow-Origin', '*')

        if (req_succeeded
            and req.method == 'OPTIONS'
            and req.get_header('Access-Control-Request-Method')
        ):
            # NOTE: This is a CORS preflight request. Patch the
            #   response accordingly.

            allow = resp.get_header('Allow')
            resp.delete_header('Allow')

            allow_headers = req.get_header(
                'Access-Control-Request-Headers',
                default='*'
            )

            resp.set_headers((
                ('Access-Control-Allow-Methods', allow),
                ('Access-Control-Allow-Headers', allow_headers),
                ('Access-Control-Max-Age', '86400'),  # 24 hours
            ))

使用上述方法时,OPTIONS 请求也必须在您用于身份验证、内容协商等的任何其他中间件或挂钩中进行特殊处理。例如,您通常会跳过预检请求的身份验证,因为它根本没有必要;请注意,此类请求在任何情况下都不包含 Authorization 标头。

你现在可以把它放在中间件中

api = falcon.API(middleware=[
    CORSComponent()
])
于 2020-05-20T17:39:10.773 回答
1

边注:

ORIGIN '*' 在某些浏览器上不起作用.. 特别是 IE。过去,我不得不将 ORIGIN 标头动态设置为 HTTP 标头中请求的“主机”名称,以支持我设置的站点的通配符域主机。

于 2019-03-20T20:36:14.250 回答