【问题标题】:How to receive AJAX data in CherryPy如何在 CherryPy 中接收 AJAX 数据
【发布时间】:2011-11-26 12:42:26
【问题描述】:

开始爬上 ajax 学习曲线,我正尝试对我的 CherryPy 应用程序进行简单的 ajax 回调,并将发送回浏览器的数据回显。

我的 ajax 调用正在工作,例如,我可以将请求方法返回给浏览器。

但是,我无法在 CherryPy 处理程序内的请求对象中找到浏览器发送的数据。这是我的 CherryPy 处理程序,抄自 this question

class Contact:

def index(self):

    cl = cherrypy.request.headers['Content-Length']
    rawbody = cherrypy.request.body.read(int(cl))
    body = None
    #body = simplejson.loads(rawbody)
    if body is None:
        return cherrypy.request.method + ' (no body found)'
    else:
        return cherrypy.request.method + ' ' + body


index.exposed = True

这是我的 Javascript:

<script type="text/javascript">
function SendContactEntry() {
$.ajax( {type:        "POST",
     url:         "/contact/",
     data:        { word: "HELLO" },
     processData: false,
     cache:       false,
     contentType: "application/json",
     dataType:    "text",
     success:     function (response){
                alert(response);
              }
    }
);
}
</script>    

使用此代码,我的浏览器会收到“POST(未找到正文)”的响应。

我想做的是在我的 CherryPy 处理程序中了解我收到了一个 word 值“HELLO”。

如果我取消注释 body = simplejson.loads(rawbody) 行,我会收到来自 CherryPy 的 HTML 状态 500。如果我尝试用@cherrypy.tools.json_in() 装饰我的 index() 函数,也会发生同样的情况。

【问题讨论】:

    标签: jquery ajax cherrypy


    【解决方案1】:

    由于您已将processData 设置为false,并且您正在传递一个您正在发送的数据对象的字符串版本的对象 - 并且没有什么可看的。

    要么:

    1. 在发送数据对象之前调用 JSON.stringify (这将使您的 simplejson.loads 调用正常工作)。
    2. 删除您的 processData 属性,让 jQuery 将请求作为正常的 URL 编码请求发送(您可以通过 request.params["word"] 访问您的变量)。

    【讨论】:

    • 此时,我不关心数据是 JSON 还是查询字符串。 contentType 在那里,因为我发现没有它我收到了失败状态 500。我不记得我何时以及为什么添加了 processData 指令,但我今晚会在没有它的情况下重新测试。只知道(而不仅仅是期望)数据应该显示在.params 中是有帮助的。
    • 当我删除 processData 参数时,我的服务器处理程序中仍然没有参数。如果我还删除了 contentType 参数,我的处理程序将不再执行,我的状态为 400。但是,如果我在我的数据上调用 JSON.stringify,那就行了!
    【解决方案2】:

    word 可能已经在cherrypy.request.params 中。在那里登记?

    http://www.cherrypy.org/wiki/RequestObject#params

    我认为 jQuery 不会将您放入 data 的内容转换为 JSON 对象。 http://api.jquery.com/jQuery.ajax/

    【讨论】:

    • cherrypy.request.params 中没有任何内容(len() 为 0)。我很乐意在请求中找到我的值anywhere — 我查看了正文、标头等。
    • 你能用浏览器嗅探请求,看看它是如何发送的吗? Chrome 中的 Inspector 或 firefox 中的 Firebug。 rawbody 也包含任何内容吗?
    • 我正在使用 Chrome 中的 javascript 控制台检查响应代码,但我不知道如何查看传出请求。
    • 检查器的网络选项卡,(打开选项卡然后刷新页面以确保其处于活动状态)然后执行触发 AJAX 请求的操作,您将看到它在Network选项卡,然后点击它,右侧会有很多信息:请求、响应等。
    • 谢谢,我不知道我可以窥探到那种程度。特别是,在我刚刚在 CherryPy 控制台上看到状态 500 的情况下,我的 ajax 调用正在接收 Python 错误的堆栈跟踪。使用它,以及 Sean 提到的对 JSON.stringify 的调用,以及来自 fumanchu 的早期答案中的代码,我现在可以使用 JSON 传输了。
    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 2017-11-13
    • 2011-04-14
    • 2017-09-25
    • 2014-07-17
    • 1970-01-01
    • 2017-09-26
    • 2017-01-20
    相关资源
    最近更新 更多