尝试将React和Flask进行协同配合

目标

我想使用React和Flask创建一个应用程序。
在那之前,先将它们协调起来并尝试进行一些反映。

流程

建立一个Project

我們決定將目錄結構分成前端和後端。
參考文章→https://qiita.com/mihonak/items/91ac9c068831c0a3bb88

启动各种操作

image.png

每次看都很帅气对吧

在后端,我们还将从Flask的官方文档中引用源代码并尝试运行。官方文档链接→https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/quickstart.html#a-minimal-application

image.png

创建端点

我們將考慮從Python端返回適當的數據值。

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/data', methods=['GET'])
def get_data():
    data = {'name': 'tarou', 'age': 30, 'job': 'developer'}
    return jsonify(data)

if __name__ == '__main__':
    app.run(debug=True)

创建React

我們將創建一個應用程序,從終端點獲取並顯示數據。

import { useEffect, useState } from 'react';
import './App.css';
import axios from "axios";

interface Data {
  name: string;
  age: number;
  job: string;
}

function App() {
  const [data, setData] = useState<Data | null>(null);

  useEffect(() => {
    axios.get('http://127.0.0.1:5000/api/data')
      .then((response) => setData(response.data))
      .catch((error) => console.error(error));
  }, []);

  return (
    <div className="App">
      <header className="App-header">
        <div>
          {data && (
            <div>
              <p>Name: {data.name}</p>
              <p>Age: {data.age}</p>
              <p>Job: {data.job}</p>
            </div>
          )}
        </div>
      </header>
    </div>
  );
}

export default App;
image.png

设置代理

因为调查了一下但只有一点点理解,所以试着问了ChatGPT。

プロキシの設定: このステップはReactとFlaskが同じマシン上の異なるポートで動作するときに重要です。
例えば、Reactは通常ポート3000で、Flaskはポート5000で動作します。

異なるポートから来るリクエストは、セキュリティ上の理由からウェブブラウザによってブロックされる可能性があるため、これは問題となります。

これを解決する方法の1つは、CORS (Cross-Origin Resource Sharing)を設定することですが、これは複雑でエラーが発生しやすいです。

その代わりに、Reactの開発サーバーにプロキシを設定することが推奨されます。
これは、Reactの開発サーバーがFlaskのサーバーに直接リクエストを転送するようにすることです。
これにより、Reactアプリケーションは自分自身が動作しているポート(通常は3000)からリクエストを送り、これがプロキシによってFlaskのポート(通常は5000)に転送されます。
結果として、ウェブブラウザはこのリクエストを同一オリジンからのものとして扱い、問題なくリクエストを許可します。

このプロキシを設定するには、Reactアプリケーションのpackage.jsonファイルにproxyフィールドを追加します。

听说来自不同端口的通信会被视为安全风险而被阻止。
试试用React推荐的方法。

{
  "proxy": "http://127.0.0.1:5000",
}

稍后,我对源代码进行了一些修正,成功地进行了反映。

反应
反应的功能
进口{ useEffect,useState } from ‘反应’;
‘./App.css’中的进口;
进口的变种;
函数应用程序(){
const [data,setData] = useState <数据| null>(null);useEffect(()=> {
axios.get(’http://127.0.0.1:5000/api/data’)
.然后((响应)=> {setData(响应。数据)})
.捕获((错误)=> console.error(错误))。
}, []);

返回 (

{数据&&(

名称:{数据.名称} </ p>

年龄:{数据.年龄} </ p>

工作:{数据.工作}</ p>
</ div>
)}
</ div>
</ header>
</ div>
);
}

导出默认应用

Flask
从 flask 包中导入 Flask 和 jsonifyapp = Flask(__name__)

@app.route(‘/’, methods=[‘GET’])
def hello():
return ‘

你好,世界

@app.route(‘/api/data’, methods=[‘GET’])
def get_data():
data = {‘name’: ‘太郎’, ‘age’: 30, ‘job’: ‘开发人员’}
return jsonify(data)

if __name__ == ‘__main__’:
app.run()

image.png
广告
将在 10 秒后关闭
bannerAds