Python Bottle - jQuery AJAX成功函数响应为HTML
我在使用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 个回答
这个路由被设置为返回一个视图,而不是一个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.