Falcon CORS 中间件无法正常工作
Falcon CORS middleware does not work properly
我使用 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 服务发出任何 post 请求时,我收到此警告:
Aborting response due to origin not allowed
但是,然后我从 API 那里得到了正确的回复。
这是关于此模块的官方文档:https://github.com/lwcolton/falcon-cors
您的代码与 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
header 从请求中被省略了。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
The Origin header indicates the origin of the cross-site access request or preflight request.
旁注:
ORIGIN '*' 不适用于某些浏览器.. 特别是 IE。过去,我不得不将 ORIGIN header 动态设置为 HTTP header 中请求的 'host' 名称,以便为我设置的站点支持通配符域名主机。
我按照指导试过了by lwcolton on github here
同时设置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])
还有另一种方法可以不使用 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
))
When using the above approach, OPTIONS requests must also be special-cased in any other middleware or hooks you use for auth, content-negotiation, etc. For example, you will typically skip auth for preflight requests because it is simply unnecessary; note that such request do not include the Authorization header in any case.
您现在可以将其放入中间件
api = falcon.API(middleware=[
CORSComponent()
])
我使用 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 服务发出任何 post 请求时,我收到此警告:
Aborting response due to origin not allowed
但是,然后我从 API 那里得到了正确的回复。
这是关于此模块的官方文档:https://github.com/lwcolton/falcon-cors
您的代码与 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
header 从请求中被省略了。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
The Origin header indicates the origin of the cross-site access request or preflight request.
旁注:
ORIGIN '*' 不适用于某些浏览器.. 特别是 IE。过去,我不得不将 ORIGIN header 动态设置为 HTTP header 中请求的 'host' 名称,以便为我设置的站点支持通配符域名主机。
我按照指导试过了by lwcolton on github here
同时设置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])
还有另一种方法可以不使用 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
))
When using the above approach, OPTIONS requests must also be special-cased in any other middleware or hooks you use for auth, content-negotiation, etc. For example, you will typically skip auth for preflight requests because it is simply unnecessary; note that such request do not include the Authorization header in any case.
您现在可以将其放入中间件
api = falcon.API(middleware=[
CORSComponent()
])