ajax返回空字符串而不是json [python cgi]

时间:2013-11-17 23:15:03

标签: javascript jquery python ajax json

基本上,我有一个cgi脚本打印出有效的json,我已经检查过,我有一个类似的功能,但是这个功能不一样,但是我找不到它。

使用Javascript:

function updateChat(){ 
$.ajax({
            type: "get",
            url: "cgi-bin/main.py",
            data: {'ajax':'1', 'chat':'1'},
            datatype:"html",
            async: false,
            success: function(response) {
                alert(response); //Returns an empty string
            }, 
            error:function(xhr,err)
            {
                alert("Error connecting to server, please contact system administator.");
            }
        });

这是python打印出来的JSON:

[
"jon: Hi.",
"bob: Hello."
]

我使用json.dumps来创建它在以前的函数中工作的JSON,这些函数几乎只有不同内容的JSON布局。

有更多的服务器代码,我试图复制出相关的部分。基本上我只是想为了学习目的过滤丑陋的聊天记录。我用正则表达式过滤它,然后用它创建一个json。

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-

    print "Content-type: text/html\n\n"
    print 

    import cgi, sys, cgitb, datetime, re, time, random, json

    cgitb.enable()

    formdata = cgi.FieldStorage()


    def tail( f, window=20 ): 
        BUFSIZ = 1024
        f.seek(0, 2)
        bytes = f.tell()
        size = window
        block = -1
        data = []
        while size > 0 and bytes > 0:
            if (bytes - BUFSIZ > 0):
                # Seek back one whole BUFSIZ
                f.seek(block*BUFSIZ, 2)
                # read BUFFER
                data.append(f.read(BUFSIZ))
            else:
                # file too small, start from begining
                f.seek(0,0)
                # only read what was not read
                data.append(f.read(bytes))
            linesFound = data[-1].count('\n')
            size -= linesFound
            bytes -= BUFSIZ
            block -= 1
        return '\n'.join(''.join(data).splitlines()[-window:])


    def updateChatBox():
        try:
            f = open('test.txt', 'r')
            lines = tail(f, window = 20)
            chat_array = lines.split("\n")
            f.close()
        except:
            print "Failed to access data"
            sys.exit(4)

        i = 0
        while i < len(chat_array):
            #remove timer
            time = re.search("(\[).*(\])", chat_array[i])
            result_time = time.group()
            chat_array[i] = chat_array[i].replace(result_time, "")
            #Removes braces around user
            user = re.search("(\\().*?(_)", chat_array[i])
            result_user = user.group()
            chat_array[i] = chat_array[i].replace("(", "")
            chat_array[i] = chat_array[i].replace(")", "")
            #Removes underscore and message end marker
            message = re.search("(_).*?(\|)", chat_array[i])
            result_message = message.group()
            chat_array[i] = chat_array[i].replace("_", ":")
            chat_array[i] = chat_array[i].replace("|", "")
            data += chat_array[i] + "\n"
            i = i + 1
        data_array = data.split("\n")
        json_string = json.dumps(data_array)
        print json_string



    if formdata.has_key("ajax"):
        ajax = formdata["ajax"].value
        if ajax == "1": #ajax happens

            if formdata.has_key("chat"):
                    chat = formdata["chat"].value
                    if chat == 1:
                        updateChatBox()
                else:
                    print "ERROR"
                    elif formdata.has_key("get_all_stats"):
                            get_all_stats = formdata["get_all_stats"].value
                            if get_all_stats == "1":
                                getTopScores()
                    else:
                        print "ERROR"

这也是一个完美运行的函数,它位于同一个python文件中

def getTopScores():
    try:
        f = open('test_stats.txt', 'r')
        stats = f.read()
        stats_list = stats.split("\n")
        f.close()
    except:
       print "Failed reading file"
       sys.exit(4)

    json_string = json.dumps(stats_list)
    print json_string

唯一的区别是使用tail函数和regex,最终结果JSON实际上看起来完全相同。

1 个答案:

答案 0 :(得分:1)

您确定updateChatBox甚至被调用了吗?请注意,您将ajax与字符串"1"进行比较,但您将聊天与整数1进行比较。我打赌其中一个不匹配(特别是聊天一个)。如果不匹配,您的脚本将会丢失,而不会返回值。

此外,虽然这不是根本原因,但您应该清理内容类型以确保正确性。您的Javascript AJAX调用被声明为期待响应中的html,并且您的cgi脚本也设置为返回content-type:text/html。这些内容应分别更改为jsoncontent-type:application/json