【问题标题】:Falcon CORS middleware does not work properlyFalcon CORS 中间件无法正常工作
【发布时间】:2017-05-05 23:27:01
【问题描述】:

我使用Falcon CORS 只允许从多个域访问我的网络服务。但它不能正常工作。

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

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

【问题讨论】:

    标签: python cors falcon


    【解决方案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 资源类,它易于测试和重现,我很乐意提供帮助。

    编辑:

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

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

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

    【讨论】:

    • 对不起,这是我的错,我将 crossdomain_origin 导入为 cors,所以这只是代码示例中的错误,而不是我的项目中的错误
    • 好的,请发布一个重现问题的最小示例,其他人没有其他方法可以提供更多帮助。
    • 什么版本的python? config 模块的内容是什么?资源字典是空的 - 请给出一个工作示例。没有这些东西就无法运行。 gist.github.com 有时也很有用,因为您可以将多个文件发布到一个 gist 中。
    • 如果你有时间并且对这个问题感兴趣,我们可以用几分钟的Skype电话,我可以更广泛地向你解释我的问题
    【解决方案2】:

    旁注:

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

    【讨论】:

      【解决方案3】:

      我按照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])
      

      【讨论】:

        【解决方案4】:

        还有另一种方法可以在不使用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()
        ])
        

        【讨论】:

          猜你喜欢
          • 2017-04-06
          • 2021-08-02
          • 2013-01-26
          • 2015-09-16
          • 1970-01-01
          • 1970-01-01
          • 2020-08-31
          • 2019-05-12
          • 2021-07-24
          相关资源
          最近更新 更多