Python Bottle - jQuery AJAX成功函数响应是HTML

时间:2014-06-10 18:22:01

标签: jquery python ajax bottle locals

我遇到了Python Bottle和jQuery AJAX函数的问题。现在,当我在按钮提交调用(通过jQuery.submit()函数)后尝试使用AJAX调用时,传回的数据是整个HTML文本。

在瓶子方面,我的代码看起来像这样:

@route('/testing')
@view('test.tpl')
def test():
    myDict = request.query.decode()
    data = 100
    a = 1
    b = 2
    c = []
    if myDict:
         c.append(myDict['var1'])
         c.append(myDict['var2'])
         return json.dumps(c)
    return locals()

在JS方面,我的代码看起来像这样:

$('#buttonSubmit').submit(function(d) {
    e.preventDefault();
    $.ajax({
        type: 'GET', // I get that this is redundant
        // dataType: 'json',
        url: '/testing?var1=test1&var2=test2',
        success: function(data) { console.log(data); }
    });
});

在HTML方面,我的代码看起来像这样:

<form id='buttonSubmit'>
    <button type='submit'>Go</button>
</form>

我的假设是,当我单击按钮时,它会进行AJAX调用,通过Bottle界面进入Python文件。在此.py文件中,它将进行test()调用并返回本地值的字典(通过locals())。但是,当我登录到控制台时,“数据”和“传回的对象,结果是整个HTML文件(包括标签)。

我的问题是:为什么会这样?我已经发现jqXHR对象的responseText匹配给成功函数回调的数据。

修改

让我解释一下这个的一般流程。我首先加载/testing页面。执行此操作后,test.tpl模板文件呈现正常,Python文件将返回locals()字典。但是,在加载这个页面之后,当一个AJAX调用被触发时,我让它转到同一个带有查询的test() Bottle方法。为了响应这个AJAX查询,locals()仍将返回相同的数据,但是将返回给JS的数据(属于success回调函数的数据)现在将是整个HTML文本,而不是字典。

但是,如果我要更改它并有一个单独的返回(即return json.dumps(c)),那么注册的数据将是一个JSON文件(一旦我添加到dataType='json'部分。所以我猜这是我的困惑。有什么不同的AJAX会导致这个结果?

1 个答案:

答案 0 :(得分:1)

该路由配置为返回视图,而不是JSON dict。如果你注释掉这一行,那么它将返回一个dict:

@view('test.tpl')

view仅在响应为dict时呈现模板。如果它是一个字符串(如json.dumps的回复中所示),它只是将结果传递给未经修改的字符串:

% pydoc bottle.view

bottle.view = view(tpl_name, **defaults)
    Decorator: renders a template for a handler.
    The handler can control its behavior like that:

      - return a dict of template vars to fill out the template
      - return something other than a dict and the view decorator will not
        process the template, but return the handler result as is.
        This includes returning a HTTPResponse(dict) to get,
        for instance, JSON with autojson or other castfilters.