XMLHttpRequest Returns 404 即使文件存在

XMLHttpRequest Returns 404 Even Though File Exists

这就是我的项目的文件结构。语音、文本和模板是文件夹。

我 运行 python app.py,当我转到本地主机 http://0.0.0.0:8080/ 时,我可以看到 index.html 页面,内容由 app.py 管道输入。

index.html 中有从 voice.txt 管道输入的文本,如果我在我的文本编辑器中查看 voice.txt,我可以看到 app.py 中的循环成功每 20 秒向其添加更多文本。

我遇到的问题是试图将更新后的 voice.txt 文本放入 index.html 的正文中。我正在尝试使用 XMLHttpRequest 执行此操作。这是 index.html 中标签的相关代码:

function UpdateText() {
var xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function(){
    if (this.readyState == 4 && this.status == 200) {
        // Code goes here
        document.getElementById("main").innerHTML = this.responseText;
        console.log(statusText);
        console.log(responseText);
    }
};

xhttp.open("GET", "../Text/voice.txt", true);
xhttp.send();

};

当我 运行 index.html 正确显示时,但当它尝试更新文本时,我在终端中收到以下错误消息:

127.0.0.1:64013 - - [28/May/2019 00:55:10] "HTTP/1.1 GET /Text/voice.txt" - 404 Not Found

我可能是错的,但在这一点上我相当确定 xhttp.open() 中的文件路径实际上应该是 URL(这是我第一次使用 XMLHttpRequest 和每个教程我只看到了文件名,没有其他内容),在这种情况下,我不确定如何 link 到 voice.txt。我为此使用 web.py 库,这里是 app.py 的相关部分:

urls = (
"/", "index",
)

indexpath = "/Users/[USERNAME]/torch/torch-rnn/voice/Template/"
render = web.template.render(indexpath)

class index(object):
def GET(self):
    the_voice = open(voicepath, "r+").read()    
    return render.index(the_voice)

if __name__ == "__main__":
app = web.application(urls, globals())
app.run()

我觉得解决方案可能涉及更改 urlsrender 变量中的某些内容,但我一直在兜圈子几个小时,但我没有想法.

我试过的

我首先想到的是将一个名为 voice.txt 的虚拟文件放入 index.html 旁边的模板文件夹中,然后更改 XMLHttpRequest 中的文件路径以反映这一点,但我仍然得到了同样的错误信息。

您的 Web 服务器 知道一个 URL “/” 并且 return 当被问到 'https://:8080/'.这就是您在 urls =() 位中列出的所有可能值。

因此,您尝试通过 Web 界面获取任何其他内容都将失败。如果你想让网络服务器检索你的 voice.txt 文件,你需要将它或匹配它的东西包含在 urls 中,然后让 class 获取并发送voice.txt 文件。 (请注意,文件本身不在 Text 文件夹中,它们可以在任何地方,如 myDirectory 所述。)

例如,

urls = ( "/", "index",
         "/Text/(.*)", "get_file")

class get_file(object):
    def GET(self, filename):
        the_file = open(myDirectory + '/' + filename, "r").read()
        return the_file

可能会做你想做的事(或给你一些想法)。通过使用 urls 中的正则表达式,任何 http get like '/Text/foo', '/Text/voice.txt', '/Text/ant_eater.jpg' 将尝试读取文件 ( 'foo'、'voice.txt'、'ant_eater.jpg') 在 myDirectory 描述的目录中,并且 return 该文件给用户。

如果您提供不同类型的文件(如我的示例),您还应该为内容类型设置 headers,但这是一个不同的问题。