【问题标题】:AJAX Post to store JSON with Python and javascriptAJAX Post 使用 Python 和 javascript 存储 JSON
【发布时间】:2013-05-05 15:42:13
【问题描述】:

我在让 AJAX 正确发布 JSON 时遇到问题。该应用程序旨在托管在 Google App Engine 上。但我所拥有的并没有发布数据。

Python

 mainPage = """
    <html>
    html is included in my python file.
    </html>
    """ 

    class JSONInterface(webapp2.RequestHandler):
    def post(self):
        name =self.request.get('name')
        nickname =self.request.get('nickname')

        callback = self.request.get('callback')
        if len(name) > 0 and len(nickname) >0:
            newmsg = Entry(name=name, nickname=nickname)
            newmsg.put()
        if len(name)>0:
            self.response.out.write(getJSONMessages(callback))
        else:
            self.response.out.write("something didnt work")

    def get(self):
        callback = self.request.get('callback')
        self.response.out.write(getJSONMessages(callback))

此处理程序旨在处理来自 Web 应用程序的 Ajax 调用。我不确定是否需要将 javascript 与我的主页相关联才能这样做,因为我还没有通过搜索找到关于它的信息。

Javascript

$(document).ready( function() {

    $("#post").bind('click', function(event){
           var name = $("#name").val();
           var nickname = $("#nickname").val();

            postData = {name: name, nickname: nickname, callback: "newMessage"};

        $.ajax({
            type: "POST",
            url: "http://localhost:27080/json",
            data: postData,
            dataType: "json",
            done: function() {
                // Clear out the posted message...
                $("#nickname").val('');
            },
            fail: function(e) {
                confirm("Error", e.message);
            }
        });
        // prevent default posting of form (since we're making an Ajax call)...
        event.preventDefault();
    });

帖子的Javascript

有人可以建议我如何解决我遇到的问题。感谢您的时间和帮助。

【问题讨论】:

  • 我可能会尝试添加 contentType: "application/json",
  • 我的主页处理程序上有。 def get(self): self.response.headers['Content-Type'] = 'text/html' self.response.out.write(mainPage) 只是用来返回页面。
  • python 文件中的路由处理程序配置正确吗?另外,您使用的是 jQuery 吗?前导 $ 被省略。应该是 $(document).ready()。但请确保您的处理程序指向 ('/json', JSONInterface)。
  • 是的,我使用的是 Jquery,我在复制和粘贴时出错了。 $ 是其中的一部分。感谢您在我的帖子中指出这一点。
  • 我认为是复制/粘贴问题:)

标签: javascript python ajax google-app-engine


【解决方案1】:

你昨天问了同样的问题然后删除了吗?我发誓我刚刚回答了同样的问题。

您不会将 data 作为 JSON 字符串发送。如果您想以 JSON 格式发送,则需要将 data 编码为 JSON 字符串,否则您只是将其作为查询字符串发送。

data: JSON.stringify(postdata),

但是,您的请求处理程序实际上将请求正确地处理为查询字符串而不是 JSON,因此您可能不想这样做。

【讨论】:

  • 抱歉,我以为我自己解决了问题并删除了线程以避免人们回答。您是否建议我更改处理程序处理字符串以使用数据的方式:JSON.stringify(postdata),?
  • 您可以在不编码的情况下访问服务器上的数据。它被解释为键:值。如果你对它进行 json 编码,你需要在你的服务器端导入一个 json 库并在你的数据上调用 json.loads()。
  • 您传递的参数非常简单,并且实际上不需要使用 JSON。 JSON 对于结构化数据更有用。至于回答这个问题,你应该接受rGil的回答(点击问题旁边的复选框)而不是删除它。
【解决方案2】:

对于初学者来说,ajax 调用非常接近。完整路径

"http:://localhost:27080/json"

不是必须的,相对路径可以,但这不是问题。

就目前而言,您的回调将作为“成功”工作:

success: function(response) {
            alert(response);

            // Clear out the posted message...
            $("#nickname").val('');
        }

但是,此回调正在逐步淘汰,以支持 other methods。 'Done' 应该像这样被链接起来:

 $.ajax({
        type: "POST",
        url: "/json",
        data: postData,
        dataType: "json"            
    }).done(function(data){
        console.log(data);
    });

另外,服务器可能存在问题。如果您使用一些日志记录,您将看到数据确实正在发送到服务器。

import json ## we'll get to this below
import logging
class JSONInterface(webapp2.RequestHandler):
def post(self):
    name = self.request.get('name')
    logging.info(name) ## will print the value of 'name'

除非您的 python 函数 getJSONMessages(callback) 返回一个 json 对象,否则即使您添加了响应参数,您的回调也不会被调用。 在你的 python 代码中:

import json
import logging
class JSONInterface(webapp2.RequestHandler):
    def post(self):
        callback = self.request.get('callback')
        logging.info(callback) # will print correctly
        self.response.out.write(json.dumps(callback)) 

使用json.dumps method 将传递的对象编码为json,这是您的ajax 对象正在寻找的。​​p>

【讨论】:

  • 我不确定 asJSONString() 是什么,但它会给我一个错误:AttributeError: 'unicode' object has no attribute 'asJSONstring. json.dumps(yourData) 是你需要的
  • 我已根据您的建议修改了我的代码,但我看不到 logging.info。你能告诉我 SDK 控制台和 GAE 日志是否是我要检查的地方吗?很抱歉问了这么明显的问题。我似乎找不到检查日志文件的信息。
  • SO - 将 json.dumps() 合并到您的代码中。此外,“完成”方法需要链接到 ajax 函数的末尾。如果您保持现在的状态,请将“完成”更改为“成功”。我会更新我的答案以反映这一变化。
  • 我的日志看起来只包含 INFO 2013-05-11 02:50:42,128 server.py:561] 默认值:“GET / HTTP/1.1”200 2725 INFO 2013-05-11 02: 50:45,555 server.py:561] 默认值:“POST / HTTP/1.1”405 188 INFO 2013-05-11 02:50:50,378 server.py:561] 默认值:“POST / HTTP/1.1”405 188 INFO 2013 -05-11 02:54:16,631 server.py:561] 默认值:“GET / HTTP/1.1”200 2725 INFO 2013-05-11 02:54:16,690 server.py:561] 默认值:“GET /js. js HTTP/1.1" 404 154 大多数是获取 favicon ico。这是否意味着我的 python 存在更多问题。
  • 另外,删除我添加的 self.request... - 因为这些只是我看到您的代码之前的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多