【问题标题】:Python return jsonp for autocompletePython 返回 jsonp 用于自动完成
【发布时间】:2015-12-13 06:48:41
【问题描述】:

我正在使用 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 is not defined 在萤火虫中,我可以看到 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', variable。我也尝试只返回文本而不是 json。我不知道该怎么办。为了使用自动完成功能,我应该使用 python 函数返回什么?我相信我的问题就在那里。

【问题讨论】:

    标签: javascript jquery python autocomplete jsonp


    【解决方案1】:

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

     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
    

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      问题似乎出在 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")
      

      【讨论】:

      • 否,因为存在跨域问题。如果您返回 json,由于安全原因,它会被阻止。所以唯一能够避免这种解决方案的格式是 jsonp。但是如果我理解正确的话 jsonp 应该在 callbackFunction({'query':q,'data':data... 等脚本函数中敲击。
      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 2012-04-26
      • 2017-10-15
      • 2013-07-31
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多