Juptyer Kernel Gateway CROS - PullRequest
       12

Juptyer Kernel Gateway CROS

0 голосов
/ 14 сентября 2018

У меня есть Jupyter KernelGatewayApp, работающий на экземпляре виртуальной машины в облаке Google.Я определил API, который отвечает на оператор GET.
Если я объединю IP-адрес экземпляра виртуальной машины с портом шлюза ядра и оператор GET с правильными параметрами, я получу желаемый результат.
ОднакоЯ хотел бы вызвать API с помощью кнопки JavaScript на другом сайте.Это не работает, так как браузер сначала отправляет оператор OPTIONS, на который мне не удается правильно ответить.

Конкретно у меня есть следующее:

Запуск шлюза ядра Jupyter на порту 8888: 33.44.567.789:8888
Рабочий API: 33.44.567.789:8888/api?fname=john&lname=doe
Другой веб-сайт, где кнопка javascript вызывает вышеуказанный API: johndoe.me

Возвращает следующую ошибку на стороне запросчика (браузера):

XMLHttpRequest не может загрузить http://33.44.567.789:8888/api?fname=john&lname=doe. Поле заголовка запроса Тип содержимого не разрешен Access-Control-Allow-Headers в ответе перед полетом.

Создает на сервере следующее сообщение:

ИНФОРМАЦИЯ: tornado.access: 200 OPTIONS / api? fname = john & lname = doe (xx.xxx.xx.xxx) 1,2 мс

Из-за того, что я прочитал здесь я добавил все разныепараметры запуска при запуске Jupyter Kernel Gateway:

jupyter kernelgateway --KernelGatewayApp.api='kernel_gateway.notebook_http' --KernelGatewayApp.seed_uri='/home/dummy_gmail_com/code/test_api.ipynb' --KernelGatewayApp.allow_origin='http://johndoe.me' --KernelGatewayApp.allow_methods='GET,OPTIONS,POST' --KernelGatewayApp.allow_credentials='true' --KernelGateway.allow_headers='Origin, X-Requested-With, Content-Type, Accept, content-type' --KernelGatewayApp.expose_headers='Origin, X-Requested-With, Content-Type,Accept' --KernelGatewayApp.answer_yes=True 

Кажется, проблема в том, что браузер выдает OPTIONS вместо GET, но я не совсем уверен.Связано ли это с фактом перекрестного происхождения?Есть ли способ справиться с этим правильно или обойти это?

1 Ответ

0 голосов
/ 22 февраля 2019

Имея ту же проблему, я обнаружил, что запросы CORS, обслуживаемые шлюзом ядра Jupyter, работают со следующими параметрами:

jupyter kernelgateway --KernelGatewayApp.api='kernel_gateway.notebook_http' --KernelGatewayApp.seed_uri='/home/dummy_gmail_com/code/test_api.ipynb' --KernelGatewayApp.allow_origin='http://johndoe.me' 

(Использование доменов OP и т. Д. Для согласованности.)

Параметр KernelGatewayApp.allow_origin='*' также сработал / Решил проблему.

Однако я ошибся, вызванная исходным сообщением об ошибке консоли браузера:

Access to fetch at 'http://localhost:8889/convert?degrees=164' from origin 
'http://localhost:3000' has been blocked by CORS policy: 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
If an opaque response serves your needs, set the request's mode to 'no-cors' to 
fetch the resource with CORS disabled.

Это побудило меня установить режим запроса на 'no-cors'. Результатом этого является предотвращение отправки заголовка Origin с запросом. При этих обстоятельствах никакие изменения параметров шлюза ядра не привели к успешному ответу.

Кроме того, при указании заголовка Allow Origin в качестве значения, отличного от '*', это должно быть точное совпадение строки с заголовком «Origin». Например:

Allow-Origin: http://127.0.0.1 не соответствует Origin: http://localhost

Allow-Origin: localhost не соответствует Origin: http://localhost

Allow-Origin: http://localhost/ не соответствует Origin: http://localhost

Allow-Origin: http://localhost не соответствует Origin: http://localhost:3000

и т.д.

...