XMLHttpRequest возвращает 404, хотя файл существует - PullRequest
0 голосов
/ 28 мая 2019

Вот как выглядит структура файла для моего проекта.Voice, Text и Template являются папками.

Folder structure for my project:

Я запускаю python app.py, и когда я иду на localhost 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, но я ходил по кругу с этим часами, и у меня нет идей.

То, что я пытался

Первая мысль, которую я должен был бросить - пустышка с именемтакже вызывается voice.txt в папке «Шаблон» рядом с index.html, затем измените путь к файлу в запросе XMLHttpRequest, чтобы отразить это, но я все еще получил то же сообщение об ошибке.

1 Ответ

1 голос
/ 29 мая 2019

Ваш веб-сервер только знает об одном URL-адресе "/" и будет возвращать его, когда его спросят как 'https://:8080/'. Это все, что вы перечислили в качестве возможных значений в вашем бите urls =().

Итак, ваша попытка получить через веб-интерфейс что-нибудь еще не удастся. Если вы хотите, чтобы веб-сервер извлекал ваш файл 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 get наподобие '/ Text / foo', '/Text/voice.txt', '/Text/ant_eater.jpg' будет пытаться прочитать файл ('foo', ' voice.txt ',' ant_eater.jpg ') в каталоге, описанном myDirectory, и верните этот файл пользователю.

Если вы обслуживаете файлы разных типов (как в моем примере), вам также следует установить заголовки для типа контента, но это другой вопрос.

...