Falcon CORS中间件无法正常工作

时间:2016-12-20 16:58:32

标签: python cors falcon

我正在使用fs.inotify.max_user_watches=1048576仅允许从多个域访问我的网络服务。但它不能正常工作。让我解释一下。

看看我的意识:

Falcon CORS

所以,当我向我的API服务发出任何帖子请求时,我会收到日志警告: ALLOWED_ORIGINS = ['*'] crossdomain_origin = CORS(allow_origins_list=[ALLOWED_ORIGINS], log_level='DEBUG') app = falcon.API(middleware=[RequireJSON(), JSONTranslator(), cors.middleware]) 。但是我从我的API得到了正确的答案。

以下是有关此模块的官方文档:https://github.com/lwcolton/falcon-cors

4 个答案:

答案 0 :(得分:4)

我尝试按照向导by lwcolton on github here

还要设置allow_all_headers = True,allow_all_methods = True

即与@Ryan comment

相同
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])

答案 1 :(得分:1)

您的代码与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资源类,我很乐意尝试提供帮助。

编辑:

从下面的评论中,听起来像猎鹰队员正常工作,而问题可能是origin标题被从请求中删除。

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

  

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

答案 2 :(得分:0)

旁注:

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

答案 3 :(得分:0)

还有另一种无需使用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()
])