2015-09-16 2 views
1

Я использую автозаполнение devbridge https://www.devbridge.com/sourcery/components/jquery-autocomplete/. Я пытаюсь получить данные json внутри одного и того же сервера, но в разных портах. Поэтому у меня проблема с кросс-доменом. Я пробовал и читал много разных подходов к этой проблеме, но я не могу ее решить. Так что у меня есть функция, которая возвращает питона это:Python return jsonp для автозаполнения

formatted_codes = {'query': query, 'suggestions':jsonData, 'data': jsonData} 
data = json.dumps(formatted_codes) 
return HttpResponse("callback(%s);"%data,mimetype="application/javascript") 

, и я пытаюсь использовать его в качестве автозаполнения:

$(function(){ 
options = { 
    serviceUrl:'http://linkname/apps/getSuggestions/start_auth?record_id=4dfcb2eb-1c71-4da1-8b3e-cbf4918a042;query=can;', 

    // jsonpCallback: 'callback', 
    dataType: 'jsonp', 
    cache: false, 
    crossDomain: true, 
    success: function(data) { 


        return { value: data.suggestions}; 

    }, 
     error:function(jqXHR, textStatus, errorThrown){ 
     alert(errorThrown); 
     } 
}; 
a = $('#query').devbridgeAutocomplete(options); 

});

Но он не работает. Он говорит, что ReferenceError: обратный вызов не определен и поджигатель я могу видеть результат функции питона, которая:

callback({'query': 'can', 'suggestions': ['Cane', 'Canal', 'Candy', 'Canis', 'Canoe', 'Canada', 'Canary', 'Canola', 'Cantil', 'Decane', 'Toucan', 'Candida', 'Candiru', 'Candoia', 'Canidae', 'Cannula', 'Indican', 'Pelican', 'Scanner', 'Acanthis'], 'data': ['Cane', 'Canal', 'Candy', 'Canis', 'Canoe', 'Canada', 'Canary', 'Canola', 'Cantil', 'Decane', 'Toucan', 'Candida', 'Candiru', 'Candoia', 'Canidae', 'Cannula', 'Indican', 'Pelican', 'Scanner', 'Acanthis']}); 

Я также попытался с jsonCallback: «обратный вызов», переменным. Я также попытался вернуть только текст, а не json. Я не знаю, что делать. Что мне следует возвращать с помощью функции python для работы с автозаполнением? Я считаю, что моя проблема есть.

ответ

0

Проблема заключается в том, что часть вашего скрипта Python содержит ссылку callback(). Я не знаю, полностью ли я это понимаю, но не вернул бы простой JSON лучше для вашей цели? Так что-то вроде:

formatted_codes = {'query': query, 'suggestions':jsonData, 'data': jsonData} 
return HttpResponse(formatted_codes, mimetype="application/json") 

Я думаю, что должно быть достаточно, даже без json.dumps части, но я не совсем уверен. Поэтому вы также можете вернуть:

return HttpResponse(json.dumps(formatted_codes), mimetype="application/json") 
+0

Нет, потому что проблема кросс-домена. Если вы вернете json, он заблокирован из-за безопасности. Таким образом, единственный формат, позволяющий избежать этого решения, - jsonp. Но jsonp, если я правильно понял, должен быть постучен в функции скрипта, например callbackFuncation ({'query': q, 'data': data ... и т. Д. – user1431148

0

Мне удалось найти решение, но для этого требуется доступ к серверу. Я использовал простой формат json, и я решил проблему между доменами, изменив настройки в Apache2. В/и т.д./apache2/сайтов-доступных/по умолчанию, я добавил в < VirtualHost *: 8000> эти строки:

Header always add Access-Control-Allow-Origin "*" 
Header always add Access-Control-Allow-Headers "origin, x-requested-with, content-type" 
Header always add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" 

Также внутри

<Directory /web/indivo_server> 
Header always add Access-Control-Allow-Origin "*" 
Header always add Access-Control-Allow-Headers "origin, x-requested-with, content-type" 
Header always add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" 
</Directory> 

I также включен mod_headers

sudo a2enmod headers 

uncomment line в http.conf или apache2.conf:

LoadModule headers_module modules/mod_headers.so 

и рестарт apache2:

sudo service apache2 restart 

Надеется, что это помогает.