gpt4 book ai didi

javascript - 如何将后端(python、flask)与前端(html、css、javascript)连接起来

转载 作者:行者123 更新时间:2023-11-30 14:05:14 27 4
gpt4 key购买 nike

信息:对于后端,我使用带有 flask 的 python(目前它接受 http get 方法),对于前端,我使用 html、css 和 javascript。

问题:我正在尝试发出一个 http 请求(我第一次尝试 POST 然后 GET)但是浏览器不允许我这样做:“Access to XMLHttpRequest at 'localhost:5000/test' from origin ' null' 已被 CORS 策略阻止:跨源请求仅支持以下协议(protocol)方案:http、data、chrome、chrome-extension、https。”。

我还有什么选择? (我想要一些简单的选择,这只是一个作业)。

我尝试发出 http POST 和 GET 请求。我读到我无法从浏览器发出 http 请求。我读过我需要(例如)一个 apache 服务器。 - 太复杂了,我需要更简单的东西。我试过:https://flask-cors.readthedocs.io/en/latest/

document.getElementById("btn").addEventListener('click', add);
function add()
{
const url = "localhost:5000/test";
const http = new XMLHttpRequest();
http.open("GET", url);
http.send();
http.onreadystatechange=(e)=> {
console.log(http.responseText)
}
}
from flask import Flask
from flask_cors import CORS
from flask import request
from flask import jsonify
import json
import mysql.connector
import random
import string
import time

time.sleep(3)
app = Flask(__name__)

@app.route("/test")
def test():
return "It's working"


if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)

我希望在浏览器控制台中打印消息:“正在运行”,但我收到错误消息:CORS 策略已阻止从来源“null”访问“localhost:5000/test”处的 XMLHttpRequest:跨来源请求仅支持以下协议(protocol)方案:http、数据、chrome、chrome-extension、https。

LE:Flask 服务器位于 docker 容器内。端口映射为“5000:5000”。

最佳答案

如果您使用同一台机器,则不需要使用flask-cors

更新:当您使用 Docker 时,您可以使用 flask-cors 来处理 CORS。

我发现您的 JS 代码中的 AJAX 调用不正确。 const url = "localhost:5000/test"; 不提供请求协议(protocol)的信息。

我按照这些步骤使用 Docker 成功运行 Flask 应用程序并使用 Docker 外部的 JS 访问 /test 端点。

  • 我更新了 AJAX 请求
  • 添加了 Dockerfile 以在 Docker 中运行 Flask 应用程序
  • 构建并运行 Dockerfile
  • 获取正在运行的Docker容器的IP地址。
  • 在 Docker 外部的 JS 代码中使用 AJAX 调用中的 IP 地址。

文件夹结构:

.
├── 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 容器 ID:

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

获取Docker容器IP地址:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' 69cb7d5d243a  

172.17.0.2

在 HTML 文件的 AJAX 请求中使用此 IP 地址:

<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>

后端.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)

输出:

frontend output

关于javascript - 如何将后端(python、flask)与前端(html、css、javascript)连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55549164/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com