Flask + React でHello World

  • 2020.11.14
  • 2021.01.24
  • Flask
NO IMAGE

PythonのFlaskとJavaScriptのReactを使ってHello Worldを出力させたいと思います。
そしてメッセージを送って、出力させるところまで一気にやります。

簡単なサーバー側とフロント側での実装がこちらの記事でできるようになります。

create-react-app コマンドを使用してReactを作ります。
設定未だの方はこちらからご覧ください。

まずは今回作成するファイル階層を確認します。

ファイル階層

app
  ├── backend
      └── main.py
  └── frontend
        ├── node_modules
        ├── package.json
        ├── public
        ├── README.md
        ├── yarn.lock
        └── src
            ├── その他省略...
            ├── App.js
            └── index.js


コマンドを使って上記のファイル構成を作成します。
こちらのコマンドでファイル構成が完成します。

$ mkdir app
$ cd app
$ mkdir backend frontend
$ touch backend/main.py
$ create-react-app frontend

Success!メッセージが表示されていればOKです。

Success! Created app at /Users/user/workspace/app

Reactで必要なモジュール(axios)もここで取得しておきます。

$ cd frontend
$ yarn add axios
$ cd ../


これで前準備OKです。コードを書いていきます。

サーバー側(Flask)


app/backend/main.py のファイルを編集していきます。

from flask import Flask
from flask import request, make_response, jsonify
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route('/index', methods = ['GET'])
def hello():
    text = 'Hello World';
    response = {'result': text};
    return make_response(jsonify(response));
@app.route('/helloworld', methods = ['GET', 'POST'])
def index():
    text = 'Hello World';
    response = {'result': text};
    return make_response(jsonify(response));
@app.route("/post", methods=['GET','POST'])
def parse():
    data = request.get_json()
    text = data['post_text']
    response = {'result': text}
    return make_response(jsonify(response))
if __name__ == '__main__':
    app.run(debug=True, port=5000, threaded=True)


フロント側(React)


app/frontend/src/App.js の編集をしていきます。
既に何か書かれていますが、全て消して下記で上書きしてください。

import React from 'react';
import axios from 'axios';
import './App.css';
export class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: '',
      labelValue: ''
    };
this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); this.updateState = this.updateState.bind(this);
}
render() {
    return (
      <div className="App">
        <h1>メッセージ</h1>
        <form onSubmit={this.handleSubmit}>
          <div>
            <label>
              <textarea name="text" cols="50" rows="3" value={this.state.labelValue} onChange={this.handleChange} />
            </label>
          </div>
          <input type="submit" value="送る" />
        </form>
        <form onSubmit={this.handleSubmitHelloWorld}>
          <input type="submit" value="Hello World" />
        </form>
        <div>
          <span>{this.state.value}</span>
        </div>
      </div>
    );
  };
posting = (url, text) => {
    const data = {
      post_text: text
    };
    this.requestPost(url, data)
    .then(response => {
      this.updateState(response.data.result);
    });
  };
requestPost = (url, data) => {
    return axios.post(url, data);
  };
handleSubmit = event => {
    const url = 'http://127.0.0.1:5000/post'
    this.posting(url, this.state.labelValue);
    event.preventDefault();
  };
handleSubmitHelloWorld = event => {
    const url = 'http://127.0.0.1:5000/helloworld';
    this.posting(url, this.state.labelValue);
    event.preventDefault();
  };
handleChange = event => {
    this.setState({ labelValue: event.target.value });
  };
  updateState = value => {
    this.setState({
      value: value,
      labelValue: ''
    });
  };
};
export default App;

実行

ターミナルが2つ必要になります。

サーバーの起動(※ app上にいる想定です)

$ python ./backend/main.py

フロント側の起動(※ app上にいる想定です)

$ cd frontend
$ yarn start

起動を止めたい時は「commnad + c 」で止まります。

これで

http://localhost:3000/

にアクセスすると画面が表示されると思います。


Hello World のボタンと実際にメッセージを入れて送ってみて、うまく表示されれば成功です。

動かないとき


・サーバーを起動したか確認 ($ python ./backend/main.py)
・フロントを起動したか確認 ($ yarn start)
・コードの見直し

所感

たったこれだけ作るのにすごい苦労しました。
サーバーとフロントをつなげるだけでとても大変でした。

無事動いた方おめでとうございます。
お役に立ててたら幸いです。

以上になります。お疲れさまでした。

Flaskカテゴリの最新記事