Привет, я новичок в 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).