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

2024-05-01 22:06:55 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上,我有一个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:

^{pr2}$

我用过json.dumps文件为了创建JSON,它在前面的函数中工作,这些函数具有几乎相同的JSON布局,只是内容不同。在

还有一大堆服务器代码,我试着把相关部分拷贝出来。基本上我只是为了学习目的过滤一个丑陋的聊天日志。我用regex过滤它,然后从中创建一个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看起来实际上是相同的。在


Tags: 函数jsonreaddatagetstringiftime
1条回答
网友
1楼 · 发布于 2024-05-01 22:06:55

您确定updateChatBox正在被呼叫吗?注意,将ajax与字符串"1"进行比较,而将chat与整数1进行比较。我打赌其中一个不匹配(尤其是聊天)。如果不匹配,脚本将在不返回值的情况下失败。在

此外,尽管这不是根本原因,但您应该清理内容类型以确保正确性。Javascript AJAX调用被声明为期望html作为响应,并且cgi脚本也被设置为返回content-type:text/html。它们应该分别改为json和{}。在

相关问题 更多 >