LINUX.ORG.RU

Flask. Ошибка вызова файла в js XMLHttpRequest

 ,


1

1

Есть группа файлов: index.html page1.html page1.js page1.svg page2.html page2.js page2.svg ... pageN.html pageN.js pageN.svg Храню все файлы в папке templates

В .js файлах есть вызов файла, который в определенном месте читает данные и возвращает json:

var xhr = new XMLHttpRequest();
...
function setPost() {
    xhr.open("POST", '/home/ioprst/work/app/tmp/get_data.py', true)
    ...
}

Вызов этого файла осуществляется много, много раз (setInterval(setPost, 100))

Написал на Flask следующее:

from flask import Flask
from flask import render_template
from flask import send_file
 
app = Flask(__name__)
 
@app.route("/")
def index():
    return send_file('templates/index.html')
 
@app.route("/<fname>", methods=['GET'])
def page(fname):
    return send_file('templates/' + fname)
 
if __name__ == "__main__":
    app.run(host='0.0.0.0')

html, svg, js Flask вроде бы возвращает без проблема (200). Но когда в js код доходит до вызова скрипта py, в консоль вылетает ошибка:

«POST /home/ioprst/work/app/tmp/get_data.py HTTP/1.1» 404 -

Хотя файл по указанному пути существует, проверил.

Подскажите, пожалуйста, в чем может быть проблема.

Эм...
Файл у тебя должен вызываться так:
https://ru.wikipedia.org/wiki/CGI
А Flask работает так:
https://ru.wikipedia.org/wiki/Сервер_приложений

В простейшем случае, тебе надо написать на питоне модуль на базе скрипта, импортировать в приложение Flask и по URL /home/ioprst/work/app/tmp/get_data.py делать работу.

Shadow ★★★★★ ()

1) У тебя нет роута, для обработки /home/... 2) Flask это не PHP и даже если ты сделаешь роут для get_data.py, то тебе вернется не результат работы скрипта, а сам скрипт. Наверное, ты хотел сделать что-то типа:

@app.route('/api/get-data', methods=['POST'])
def get_data():
    from get_data import calc
    return calc()

И в js урл поменять соответственно.

anonymous ()

Ты творишь какую-то дичь. Расскажи лучше чего хочешь добиться, а тебе расскажут как.

Если ты хочешь просто открыть индекс и это всё локально, то вместо xhr.open("POST", '/home/ioprst/work/app/tmp/get_data.py', true) пиши xhr.open("POST", 'http://127.0.0.1:8080/', true). Но нк забуть в `app.run` передать порт 8080 (80 биндится от рута). Ну и сам скрипт тоже запустить не забудь.

WitcherGeralt ★★ ()
/your_flask_project 
  /static
    /foo
      bar
  run.py

GET /foo/bar будет ток работать

Там пути относительно директории со статикой (по-умолчанию static)

tz4678 ★★ ()

добавлю что в static скрипт класть небезопасно если там у тебя не 2+2 считается, он будет доступен к просмотру

Frost ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.