Cherpy/jquery CORS-проблема

У меня есть простой веб-сервер python на основе cherrypy. Его ресурсы должны предоставлять API. Сервер имеет следующий код для предоставления CORS:

def CORS():
    cherrypy.response.headers["Access-Control-Allow-Origin"] = "*"

if __name__ == "__main__":
    cherrypy.tools.CORS = cherrypy.Tool('before_finalize', CORS)
    cherrypy.quickstart(PyCachedAdmin(), config={'/': {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}})

сервер работает на локальном хосте: 8080. Теперь у меня есть файл HTML, доступный на локальном хосте (порт 80 по умолчанию), который загружает jquery 1.9. Я открываю консоль браузера, чтобы попробовать $.ajax выполнить любой запрос AJAX к серверу cherrypy. Я пытался:

$.ajax({
  url:'http://localhost:8080/',
  type: "POST",
  dataType: "json",
  data: {command:"version"}
}).done(function(){
  console.log('hej');
});

и

$.ajax({
  url:'http://localhost:8080/',
  type: "POST",
  crossDomain: true,
  dataType: "jsonp",
  data: {command:"version"}
}).done(function(){
  console.log('hej');
});

и

$.support.cors = true

и ничего не работало. Я получаю XMLHttpRequest cannot load http://localhost:8080/. Origin http://localhost is not allowed by Access-Control-Allow-Origin. или GET http://localhost:8080/?callback=jQuery19102827550224028528_1382823727186&command=version&_=1382823727187 404 (Not Found) при использовании jsonp (загадочно, что он отправляет GET вместо POST). Есть несколько похожих вопросов, я попробовал их, и вот мои результаты (что-то все еще не так).

PS сервер в полном порядке, так как все тесты на завитки проходят. Что-то не так с междоменными вещами.


person ducin    schedule 26.10.2013    source источник
comment
Что такое браузер?   -  person Kevin B    schedule 27.10.2013
comment
это хром 27.0.1453.93   -  person ducin    schedule 27.10.2013
comment
crossDomain: true и $.support.cors = true определенно не нужны, и вам не нужен jsonp, если только ваш сервер не возвращает jsonp (в этот момент вам не понадобится cors). также невозможно отправить запрос POST jsonp, поскольку jsonp отправляется с использованием тега script, а не xhr. Ваш первый фрагмент правильный. Можете ли вы опубликовать отправляемые заголовки запроса и ответа? (хромированная консоль)   -  person Kevin B    schedule 27.10.2013
comment
@KevinB, но когда я выполняю $.ajax({ url:'http://localhost:8080/', type: "POST", data: {command:"version"} }).done(function(){ console.log('hej'); });, я получаю сообщение об ошибке: XMLHttpRequest cannot load http://localhost:8080/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.   -  person ducin    schedule 27.10.2013
comment
это нормально. но внесение любого из этих изменений не изменит результат. ваш javascript в порядке. проблема, скорее всего, заключается либо в разрешениях браузера (очень маловероятно), либо в том, что сервер просто неправильно обрабатывает запрос cors.   -  person Kevin B    schedule 27.10.2013
comment
Ты был прав. Проблема заключалась в том, что мой сервер не отправлял правильные заголовки (я отлаживал с помощью wget/curl).   -  person ducin    schedule 30.10.2013


Ответы (1)


Вы активируете инструмент CORS? Вы можете использовать инструмент, украсив методы вызова или задав его в конфигурации.

Учитывая, что реализация PyCachedAdmin не выражена в вопросе, я могу предположить, что, вероятно, вы не включаете инструмент, для этого вам просто нужно изменить словарь конфигурации и сделать что-то вроде этого:

    cherrypy.quickstart(PyCachedAdmin(),
                        config={
                            '/': {
                               'request.dispatch':
                                    cherrypy.dispatch.MethodDispatcher(),
                               'tools.CORS.on': True}})

Или если методы, которые вы используете на PyCacheAdmin, уже декорированы или используете _cp_config, то дополнительная настройка не требуется, и эти ответы вам не помогут.

person cyraxjoe    schedule 01.11.2013