Python返回jsonp进行自动完成

时间:2015-09-16 15:22:45

标签: javascript jquery python autocomplete jsonp

我正在使用devbridge https://www.devbridge.com/sourcery/components/jquery-autocomplete/的自动完成功能。 我试图在相同的服务器但在不同的端口中获取json数据。所以我有跨域问题。我已经尝试并阅读了许多关于这个问题的不同方法,但我无法解决它。所以我有一个python函数返回:

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没有定义 在firebug中我可以看到python函数的结果:

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:'callback',变量。我也试图只返回文本而不是json。我不知道该怎么办。我应该使用python函数返回什么才能使用自动完成功能?我相信我的问题就在那里。

2 个答案:

答案 0 :(得分:0)

问题似乎出现在Python脚本的HttpResponse部分,您可以在其中引用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")

答案 1 :(得分:0)

我设法找到了解决方案但需要访问服务器。我使用简单的json格式,并通过更改Apache2中的设置解决了跨域问题。 在/ etc / apache2 / sites-available / default里面我添加了< 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>

我也启用了mod_headers

sudo a2enmod headers

在http.conf或apache2.conf中取消注释行:

LoadModule headers_module modules/mod_headers.so 

并重新启动apache2:

 sudo service apache2 restart

希望它有所帮助。