无法让Web.py和jQuery计算出AJAX GET请求(它转而使用OPTIONS请求)

时间:2013-07-26 10:32:54

标签: python ajax jquery web web.py

我想让(最新的)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's network panel, showing the request

如果我打开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”也无济于事。

1 个答案:

答案 0 :(得分:1)

钉了它。

问题出在客户端代码上。我从请求本身中删除了contentType,它运行得很好。