我想让(最新的)Web.py和AJAX互相玩得很好,但到目前为止我运气不好。
长话短说,我在本地开发计算机上运行服务器端(Web.py)和客户端(Javascript),但不知怎的,我的所有AJAX GET请求都显示为OPTION请求。从我读过的,这是典型的跨域请求的情况,但由于我在localhost上运行它,我不知道发生了什么。
这是服务器端代码:
import web
import json
def make_text(string):
return string
urls = ('/', 'mainScreen',
'/update', 'update'
)
app = web.application(urls, globals())
global content
content = {'key1': 'value1', 'key2': 'value2'}
def getPayload():
return content
class mainScreen:
def GET(self):
web.header('Content-Type', 'application/json')
web.header('Access-Control-Allow-Origin', '*')
web.header('Access-Control-Allow-Credentials', 'true')
return getPayload()
def OPTIONS(self):
web.header('Content-Type', 'application/json')
web.header('Access-Control-Allow-Origin', '*')
web.header('Access-Control-Allow-Credentials', 'true')
return getPayload()
class update:
def POST(self):
global content
content = web.input(_method='post')
return "DONE."
if __name__ == '__main__':
app.run()
这是客户端代码:
<html>
<head>
<title>WTF</title>
<script type="text/javascript" src="../static/jquery.js"></script>
<script type="text/javascript">
function dial()
{
console.log("Fire in the hole!");
$.ajax({
url: 'http://0.0.0.0:8080',
contentType: 'application/jsonp',
timeout : 5000,
cache: false,
success: function (data) {
console.log('[ajax] Connection successful! ' + JSON.stringify(data));
},
error:function (jqXHR, textStatus, errorThrown){
console.log(JSON.stringify(jqXHR) + ' ' + textStatus +' '+errorThrown );
}
});
console.log("Done.");
}
$(function() {
dial();
});
</script>
</head>
<body>
<div id="container"></div>
</body>
</html>
这是Firebug的输出:
在洞里射击! index.html(第9行)DONE。
index.html(第24行)[ajax]连接成功! “”
index.html(第17行)
请注意,“”表示请求获得了空数据。
这就是Firebug的网络面板显示的内容:
如果我打开Firebug表示数据正常的页面,但如果我在任何浏览器上打开http://0.0.0.0:8080/
,数据都会按预期显示!这里发生了什么?
最后,这是Web.py的日志:
hal@ubuntu:~/Desktop/tut$ python app.py
http://0.0.0.0:8080/
127.0.0.1:43796 - - [26/Jul/2013 11:14:59] "HTTP/1.1 OPTIONS /" - 200 OK
顺便说一句,我在Ubuntu 12.04 LTS编码。
PS:我也尝试将Web.py中的响应头更改为:
web.header('Content-Type', 'text/plain')
但它不起作用。
PS2:将客户端脚本上的服务器地址更改为“127.0.0.1:8080”或“localhost:8080”也无济于事。
答案 0 :(得分:1)
钉了它。
问题出在客户端代码上。我从请求本身中删除了contentType,它运行得很好。