Если вы используете ту же машину, вам не нужно использовать flask-cors
.
Обновление:
Поскольку вы используете Docker, вы можете использовать flask-cors
для обработки CORS.
Я обнаружил, что вызовы AJAX не верны в вашем коде JS. const url = "localhost:5000/test";
не предоставляет информацию о протоколе запроса.
Я выполнил следующие шаги, чтобы успешно запустить приложение Flask с помощью Docker и получить доступ к конечной точке /test
с помощью JS вне Docker.
- Я обновил AJAX-запрос
- Добавлено
Dockerfile
для запуска приложения Flask внутри Docker
- Сборка и запуск
Dockerfile
- Получить IP-адрес работающего контейнера Docker.
- Использовал IP-адрес в вызове AJAX в коде JS, который находится за пределами Docker.
Структура папок:
.
├── backend.py
├── Dockerfile
├── readme.md
└── requirements.txt
requirements.txt
Flask==1.0.2
Flask-Cors==3.0.7
Dockerfile
FROM python:3
ENV PYTHONBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
CMD ["python", "backend.py" ]
Файл сборки Docker:
docker build -t flask-docker .
Запустить Docker:
docker run -p 5000:5000 flask-docker
* Serving Flask app "backend" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Получить идентификатор контейнера Docker:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69cb7d5d243a flask-docker "python backend.py" 15 minutes ago Up 15 minutes 0.0.0.0:5000->5000/tcp
Получить IP-адрес контейнера Docker:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' 69cb7d5d243a
172.17.0.2
Используйте этот IP-адрес в запросе AJAX в файле HTML:
<html>
<head>
<title>Frontend</title>
</head>
<body>
<div id="data"></div>
<button type="button" id="btn">Grab data</button>
<script type="text/javascript">
document.getElementById("btn").addEventListener('click', add);
function add()
{
const api_url = "http://172.17.0.2:5000/test";
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("data").append(this.responseText);
}
};
xhttp.open("GET", api_url, true);
xhttp.send();
}
</script>
</body>
</html>
backend.py
from flask import Flask, request, jsonify
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route("/test")
def test():
return "It's working"
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)
Выход: