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

0 投票
1 回答
1863 浏览
提问于 2025-04-18 09:19

我在使用Python的Bottle框架和jQuery的AJAX功能时遇到了一些问题。现在,当我在点击按钮后使用AJAX调用时(通过jQuery.submit()函数),返回的数据却是整个HTML文本。

在Bottle那边,我的代码大概是这样的:

@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()

在JavaScript那边,我的代码大概是这样的:

$('#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())。但是,当我在控制台查看返回的'data'对象时,发现它竟然是整个HTML文件(包括标签)。

我的疑问是:为什么会这样?我发现jqXHR对象的responseText和传给成功回调函数的数据是一样的。

编辑:

让我来解释一下这个过程。我开始加载/testing页面。加载后,test.tpl模板文件正常渲染,Python文件返回了locals()字典。然而,在这个页面加载后,当发起AJAX调用时,我让它去同一个test() Bottle方法,并带上一个查询。对于这个AJAX查询,locals()仍然会返回相同的数据,但返回给JavaScript的数据(属于success回调函数的数据)现在却是整个HTML文本,而不是一个字典。

不过,如果我改变这个返回方式(比如return json.dumps(c)),那么注册的数据就会变成一个JSON文件(当我加上dataType='json'部分后)。所以我想这就是我困惑的地方。AJAX有什么不同之处导致了这个结果呢?

1 个回答

1

这个路由被设置为返回一个视图,而不是一个JSON字典。如果你把这一行注释掉,它就会返回一个字典:

@view('test.tpl')

view 只有在响应是字典的时候才会渲染模板。当响应是字符串(就像你从 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.

撰写回答