Javascript Python在尝试保存新JSON文件时导致服务器错误

Javascript Python在尝试保存新JSON文件时导致服务器错误,javascript,python,ajax,json,raspberry-pi,Javascript,Python,Ajax,Json,Raspberry Pi,我是Python新手,所以如果有任何明显的错误,请告诉我 我创建了一个使用Ajax的简单网页,读取服务器的XML响应,然后将其显示在页面上。我正在使用python脚本发送XML响应,它是从JSON文件构建的,并且工作得非常好 但当我向Python脚本添加一些代码,在发送XML响应之前修改JSON时,就会出现问题 以下是导致问题的代码: with open("../../../var/www/data.json", "r+") as jsonFile: data = json.load(j

我是Python新手,所以如果有任何明显的错误,请告诉我

我创建了一个使用Ajax的简单网页,读取服务器的XML响应,然后将其显示在页面上。我正在使用python脚本发送XML响应,它是从JSON文件构建的,并且工作得非常好

但当我向Python脚本添加一些代码,在发送XML响应之前修改JSON时,就会出现问题

以下是导致问题的代码:

with open("../../../var/www/data.json", "r+") as jsonFile:
    data = json.load(jsonFile)
    data[0]["A"] = "2"
    jsonFile.seek(0)  # rewind
    jsonFile.write(json.dumps(data))
    jsonFile.truncate()
当将此代码放入python文件中时,当Ajax发送POST请求时,我在浏览器控制台中遇到此错误:加载资源失败:服务器响应状态为500(内部服务器错误)

但有趣的是,尽管它阻止了我的服务器正确响应,但它确实正确地更新了我的JSON文件

为什么写入JSON文件会导致服务器不响应我的POST请求

下面是发送post请求的Javascript函数:

function sendAjax(){
    sendingAjax = true;

    console.log("sending ajax...");

    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', "/cgi-bin/xmlTest.py", true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4 && self.xmlHttpReq.status == 200) {
             if (self.xmlHttpReq.responseXML != null) {
                console.log("server responded with 4!");
                document.getElementById("paragraph").innerHTML = self.xmlHttpReq.responseXML.getElementsByTagName('data')[0].childNodes[0].nodeValue;
                sendingAjax = false;
            }
        }
    }
    self.xmlHttpReq.send();

}
下面是Python脚本:

#!/usr/bin/env python

import cgi
import cgitb
import json



#this worked to open the json file, rewrite it, and then open it again for reading but it needs to be commented out for server to respond properly
with open("../../../var/www/data.json", "r+") as jsonFile:
    data = json.load(jsonFile)
    data[0]["A"] = "2"
    jsonFile.seek(0)  # rewind
    jsonFile.write(json.dumps(data))
    jsonFile.truncate()

newJsonFile = open("../../../var/www/data.json", "r")
newData = json.load(newJsonFile)
newJsonFile.close()

cgitb.enable()


print "Content-Type: text/xml"     
print # blank line, end of headers
print "<?xml version='1.0' encoding='UTF-8' ?><inputs><data>"+newData[0]["A"]+"</data></inputs>"
#/usr/bin/env python
导入cgi
进口cgitb
导入json
#这可以打开json文件,重写它,然后再次打开它进行读取,但需要注释掉它,服务器才能正确响应
将open(“../../../var/www/data.json”,“r+”)作为jsonFile:
data=json.load(jsonFile)
数据[0][“A”]=“2”
jsonFile.seek(0)#倒带
jsonFile.write(json.dumps(数据))
jsonFile.truncate()
newJsonFile=open(“../../../var/www/data.json”,“r”)
newData=json.load(newJsonFile)
newJsonFile.close()
cgib.enable()
打印“内容类型:文本/xml”
打印#空白行,标题结尾
打印“”+新数据[0][“A”]+“”
知道为什么这段代码会导致我的服务器发送500个错误代码吗


另外,我正在使用RaspberyPi2作为我的服务器。

好的,我们在评论部分一起发现了这个bug。RP是一个linux系统,我认为权限错误可以通过
chmod
解决。以拥有apache进程的用户身份登录shell,并更改权限只需以更简单的方式执行:
cd
/www/
目录,然后运行以下命令:

cd /var/www
sudo chmod a+w data.json

请注意,这将为系统中的每个
用户授予写入权限。

那么,在不修改文件的情况下,它可以正常工作吗?我的意思是,如果你用…删除
,并保持其他所有内容不变。你使用的是什么版本的python?@khajvah-是的,如果我删除了,一切都可以。我相信raspberry pi安装了版本2和版本3,但我不确定它的Apache服务器上使用的是哪个vesion。有没有办法检查?如果代码在没有with语句的情况下工作,那么您使用的是python2,因为print语句不是有效的python3打印。我不确定apache如何与python一起工作。你的问题似乎很奇怪。with语句没有问题,但正如您所说的,正是它导致了问题。这似乎是一个apache问题,将
cgib.enable(display=0,logdir=“/path/to/logdir”)
放在
with
行之前,并查看错误消息