Ошибка CORS в Python Falcon даже с головами для Auth Pre-Flight
Получение этих ошибок при использовании глагола OPTIONS в Angular2 http.get(url, options), даже если в Falcon Rest API установлены соответствующие заголовки CORS.
XMLHttpRequest не может загрузить http://localhost:8000/names. Поле заголовка запроса Авторизация не разрешена Access-Control-Allow-Headers в ответе перед полетом.
resp.set_header("Access-Control-Allow-Origin", "*")
resp.set_header("Access-Control-Allow-Credentials", "true")
resp.set_header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT")
resp.set_header("Access-Control-Allow-Headers",
"Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers")
Для не OPTIONS / обычных запросов http.get() это работает нормально.
1 ответ
Решил это, используя falcon_cors, в частности, установив allow_all_methods = True
pip install сокол-корс
from falcon_cors import CORS
cors = CORS(allow_origins_list=['http://localhost:3000'],
allow_all_headers=True,
allow_all_methods=True)
api = falcon.API(middleware=[cors.middleware])
Я пробовал, руководствуясь lwcolton на github здесь
А также установить allow_all_headers
= Верно, allow_all_methods
= Верно
т.е. аналогично приведенному выше ответу /questions/11987861/oshibka-cors-v-python-falcon-dazhe-s-golovami-dlya-auth-pre-flight/11987872#11987872, но еще два параметра для добавления
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])
Я предлагаю просмотреть документацию по этому поводу.
Также, resp.set_header('Access-Control-Allow-Origin', '*')
не рекомендуется использовать в производственной среде. Иметь некоторые источники и методы из белого списка и на основе запроса, если вы исходите из источника из белого списка, вы можете указать здесь то же происхождениеresp.set_header('Access-Control-Allow-Origin', req.headers["ORIGIN"])
.
Ниже приведен код, который я предпочитаю:
whitelisted_origins = ["http://localhost:4200"]
whitelisted_methods = ["GET", "POST", "OPTIONS"]
class CORSComponent:
def process_request(self, req, resp):
success = False
# validate request origin
if ("ORIGIN" in req.headers):
# validate request origin
if (req.headers["ORIGIN"] in whitelisted_origins):
# validate request method
if (req.method in whitelisted_methods):
success = True
else:
# you can put required resp.status and resp.media here
pass
else:
# you can put required resp.status and resp.media here
pass
else:
# you can put required resp.status and resp.media here
pass
if success:
resp.set_header('Access-Control-Allow-Origin', req.headers["ORIGIN"])
else:
# exit request
resp.complete = True
def process_response(self, req, resp, resource, req_succeeded):
if (req_succeeded and
"ORIGIN" in req.headers and
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
))
После этого вы можете добавить это в промежуточное ПО, например:
api = falcon.API(middleware=[
CORSMiddleware(),
])
Если вы не хотите использовать описанный выше метод, вы можете использовать соколиные корки.
from falcon_cors import CORS
cors = CORS(
# allow_all_origins=False,
allow_origins_list=whitelisted_origins,
# allow_origins_regex=None,
# allow_credentials_all_origins=True,
# allow_credentials_origins_list=whitelisted_origins,
# allow_credentials_origins_regex=None,
allow_all_headers=True,
# allow_headers_list=[],
# allow_headers_regex=None,
# expose_headers_list=[],
# allow_all_methods=True,
allow_methods_list=whitelisted_methods
)
api = falcon.API(middleware=[
cors.middleware,
])
К вашему сведению, методы, поддерживаемые Falcon 2.0.0 -
'CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE'