我遇到了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会导致这个结果?
答案 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.