这是我项目的文件结构。语音,文本和模板是文件夹。
我运行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,并且我所看到的每个教程都具有文件名和其他内容),在这种情况下,我不确定如何链接到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()
我觉得解决方案可能涉及更改urls
或render
变量中的某些内容,但是我已经花了好几个小时在圈子里闲逛,而且我没有想法。 / p>
我首先想到的是将一个也称为voice.txt
的虚拟文件扔到index.html
旁边的Template文件夹中,然后更改XMLHttpRequest中的文件路径以反映这一点,但是我仍然遇到相同的错误消息。
答案 0 :(得分:0)
您的Web服务器仅 知道一个URL“ /
”,并且在询问为“ https://:8080 /”时将返回该URL。这就是您在urls =()
位中列出的所有可能值。
因此,您尝试通过Web界面获取其他任何内容的尝试都会失败。如果要让网络服务器检索voice.txt文件,则需要在urls
中包含它或与之匹配的内容,并让该类在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://'/Text/foo'、'/Text/voice.txt'、'/Text/ant_eater.jpg'的HTTP都将尝试读取文件('foo' ,“ {voice.txt”,“ ant_eater.jpg”)在myDirectory
所描述的目录中,然后将该文件返回给用户。
如果要提供不同类型的文件(如我的示例),则还应该设置内容类型的标题,但这是一个不同的问题。