Python和AJAX - HTTP响应
我正在尝试用一个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”,它就会知道请求成功,并根据返回的对象执行成功部分的命令。
不过我有两个问题:
- 我该如何让我的脚本返回错误信息?我可以返回“404”而不是“202 OK”,这样浏览器就能识别出有错误。但我不知道怎么返回错误信息。难道我需要把这个信息放在响应的头部吗?
- 我想知道我这种客户端和服务器之间的通信方式是否“太简单”了,或者说是否存在风险。当我看到其他人提出类似问题时,发现他们使用了像“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);
关于你的第二个问题:
我个人更喜欢使用现有的工具,而不是自己从头做应用程序的底层部分。我认为使用那些隐藏了不必要复杂性和模板代码的库有很多好处。这里简单列出一些我想到的:
- 我不想重复造轮子
- 使用被成千上万开发者使用的库时,出现bug的可能性更小
- 使用高级抽象时,我自己的代码会变得更好
- 使用知名库时,网上有很多好的例子可以参考
- 未来的需求往往已经被这些库覆盖
所以在你的情况下,我甚至会更进一步,看看一些轻量级的Python网络应用框架。不过这当然还要看你的具体应用需求。