Как передать данные из React Form -> Flask Backend -> React Component (имеет ли это какое-то отношение к CORS)? - PullRequest
1 голос
/ 01 декабря 2019

Привет, я новичок в React и у меня довольно простой вопрос. Я хочу выполнить следующие шаги:

(1) Предоставить пользователю форму для ввода некоторого текста (2) Вставить ввод в бэкэнд Flask и вернуть новое значение после выполнения некоторых операций (3) Предоставитьрезультат из (2) для пользователя в представлении переднего плана

Мне бы хотелось, чтобы этот процесс представлял собой одностраничное приложение, в котором пользователь не перенаправляется на другую страницу на шаге (3).

Вот мой код App.js:

import React from 'react';
import './App.css';

class App extends React.Component {

 constructor(props) {
    super(props);
    this.state = {value: '',
                  playerName: ''};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    console.log("making request")
    fetch('/result')
      .then(response => {
        console.log(response)
        return response.json()
      })
      .then(json => {
      console.log=(json)
      this.setState({playerName: json[0]})
      })
  }

  render() {
    return (
      <div>
        <form onSubmit={this.handleSubmit} action="http://localhost:5000/result" method="get">
        <label>
          Player ID:
          <input type="text" name="player_id"/>
          <input type="submit" onChange={this.handleChange} value={this.state.value} />
        </label>
      </form>
        <h1> Player Name: {this.state.playerName} </h1>
      </div>
    );
  }
}


export default App

Вот мой код main.py:

from flask import Flask, request, jsonify, send_from_directory
from sqlalchemy import create_engine
import pandas as pd

app = Flask(__name__, static_folder='../frontend/build')

@app.route('/result', methods = ['GET'])
def result():
    if request.method == 'GET':
        player_id = request.args.get('player_id', None)
        if player_id:
            data = get_player(player_id)
            name = str(data['name'][0])
            return jsonify(name)
        return "No player information is given"


def get_player(player_id):
    engine = create_engine(
        'postgres://fzmokkqt:********************-***-******-@********.com:*****/******')
    sql = """SELECT * from players WHERE id={player_id}"""
    data = pd.read_sql_query(sql.format(player_id=player_id), con=engine)
    return data

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def serve(path):
    if path != "" and os.path.exists("frontend/build/" + path):
        return send_from_directory('../frontend/build', path)
    else:
        return send_from_directory('../frontend/build', 'index.html')

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

Когда я запускаю этот код, я получаю ожидаемый результат, однако этоне помещается в HTML, как описано в коде App.js. Вместо этого результат отображается на новой странице (на localhost: 5000 вместо localhhost: 3000, где отображается код React).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...