【问题标题】:Python Bottle - jQuery AJAX success function response is HTMLPython Bottle - jQuery AJAX 成功函数响应是 HTML
【发布时间】:2014-06-26 21:26:30
【问题描述】:

我遇到了 Python Bottle 和 jQuery AJAX 函数的问题。现在,当我尝试在按钮提交调用(通过jQuery.submit() 函数)之后使用 AJAX 调用时,传回的数据是整个 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()

在 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 有什么不同?

【问题讨论】:

    标签: jquery python ajax bottle locals


    【解决方案1】:

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

    @view('test.tpl')
    

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

    % pydoc 瓶子.view bottle.view = view(tpl_name, **defaults) 装饰器:为处理程序呈现模板。 处理程序可以像这样控制其行为: - 返回模板变量的字典以填写模板 - 返回 dict 以外的东西,视图装饰器不会 处理模板,但按原样返回处理程序结果。 这包括返回一个 HTTPResponse(dict) 来获取, 例如,带有 autojson 或其他 castfilters 的 JSON。

    【讨论】:

    • 我尝试将这一行注释掉,但它确实返回了一个字典。但是,它不再注册“test.tpl”模板。我希望它仍然注册模板,同时返回字典。问题是,它为页面的初始加载执行此操作。当我返回locals()(本地变量)时,当我使用双括号({{}})引用变量时,它将在模板中注册它们。但是在 AJAX 调用中,没有运气。
    • 在 GET 与 POST 的情况下,您是否期望同一代码具有不同的行为?在这种情况下,您可以尝试创建两条相同的路由,除了一条使用method='GET',另一条使用method='POST'GET 方法会注册模板,而POST 方法不会(以便返回一个字典)。
    • 我期望 Python Bottle 代码具有相同的行为。我总是希望它返回字典。我的困惑在于模板如何呈现自己。第一次加载页面时(还没有 AJAX 调用),我使用模板文件中的内联 {{}} 从我的 Python 方法返回的字典 locals() 中获取值。但是,在 AJAX 'get' 调用之后,它发生了变化,我的 Python 调用返回的值是完整的 HTML 代码。这就是我的困惑所在。
    • 我对此感到困惑:“我希望它仍然注册模板,同时返回字典。”你怎么能从相同的电话中期待两者?返回值要么是 HTML(通过模板),要么是 JSON(无模板)。除非test.tpl 不是 HTML 模板而是 JSON 模板?
    • 抱歉,这是一个非常模糊的声明。我的意思是我希望模板中的内联语句仍然有效,并且我希望 Python 返回一个字典。所以我只是在我的 Python 方法中添加了一个 print 语句来查看它返回的内容,它是一个字典(这是在页面的初始加载时)。 test.tpl 是一个 HTML 模板。现在,如果我理解正确,为了使内联语句起作用,我确实需要返回字典。现在,为什么 AJAX 会导致 return locals() 改为返回 HTML?
    猜你喜欢
    • 2019-10-06
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2016-03-25
    • 2011-02-22
    • 2021-01-11
    相关资源
    最近更新 更多