Python和AJAX - HTTP响应

4 投票
1 回答
9934 浏览
提问于 2025-04-17 14:12

我正在尝试用一个Python脚本来处理ajax请求。这个ajax请求发送的内容是一个json对象,格式大致如下:

$.ajax({
     url : "cgi-bin/mycgi.py",
     type : "POST",
     data : JSON.stringify(MyJSONObject),
     success : function() {...do something},
     error : function(xhr,errmsg,err) {
           alert(xhr.status);
     }
}

我的Python脚本mycgi.py包含以下几行代码:

import sys
import simplejson as json

...

myjson = json.loads(sys.stdin.read())

#do something with the object

mystatus = "200 OK"

sys.stdout.write("Status: %s\n" % mystatus)
sys.stdout.write("Content-Type: application/json")
sys.stdout.write("\n\n")
sys.stdout.write(json.dumps(myjson))

基本上,一切都运行得很好。我的浏览器收到了响应,如果状态是“200 OK”,它就会知道请求成功,并根据返回的对象执行成功部分的命令。

不过我有两个问题:

  1. 我该如何让我的脚本返回错误信息?我可以返回“404”而不是“202 OK”,这样浏览器就能识别出有错误。但我不知道怎么返回错误信息。难道我需要把这个信息放在响应的头部吗?
  2. 我想知道我这种客户端和服务器之间的通信方式是否“太简单”了,或者说是否存在风险。当我看到其他人提出类似问题时,发现他们使用了像“request”这样的Python模块,或者从BaseHTTPRequestHandler派生一个类。我希望我的Python脚本尽可能简单。出于某种原因,是否有必要采用其他方式?

非常感谢!

1 个回答

2

关于你的第一个问题:

就像你把状态码设置为200时的做法一样,当你返回其他状态码时,也可以在响应中添加内容。根据不同的状态码,你应该在内容中添加一些具体的信息,或者添加额外的头部信息,这样可以遵循标准的http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

在JavaScript中,你可以为从ajax调用中获得的特定状态码设置处理程序,或者像你现在这样处理所有错误。详细信息可以查看http://api.jquery.com/jQuery.ajax/。在这些处理程序中,你可以访问响应内容并显示消息:

$.ajax({
   url : "cgi-bin/mycgi.py",
   type : "POST",
   data : JSON.stringify(MyJSONObject),
   success : function() {...do something},
   error : function(xhr,errmsg,err) {
       // show status code and response content
       alert(xhr.status + ": " + xhr.responseText);
   }
}

如果你想返回HTML并显示它,只需将响应转换为jQuery对象即可。

var response = $(xhr.responseText);

关于你的第二个问题:

我个人更喜欢使用现有的工具,而不是自己从头做应用程序的底层部分。我认为使用那些隐藏了不必要复杂性和模板代码的库有很多好处。这里简单列出一些我想到的:

  1. 我不想重复造轮子
  2. 使用被成千上万开发者使用的库时,出现bug的可能性更小
  3. 使用高级抽象时,我自己的代码会变得更好
  4. 使用知名库时,网上有很多好的例子可以参考
  5. 未来的需求往往已经被这些库覆盖

所以在你的情况下,我甚至会更进一步,看看一些轻量级的Python网络应用框架。不过这当然还要看你的具体应用需求。

撰写回答