从Flask后端反应axios GET空数据

时间:2019-11-21 03:55:53

标签: javascript reactjs flask

我在前端有一个回应表单,用户可以在其中提交他们想问的问题。使用一些NLP模型将表单数据发送到flask服务器,以计算并获得结果。然后将结果返回到前端。

问题是:我可以看到发布到Flask服务器的数据,但是当我尝试从Flask服务器获取结果时却变为null。

这是前端QuestionForm.js中的handleSubmit方法:

// post data to flask
axios.post('http://localhost:5000/api/newquestion', this.state)
.then(response => {
    console.log(response)
})
.catch(error => {
    console.log(error)
})

QuestionResult.js中的

componentDidMount()方法:

class QuestionResult extends Component {
    constructor() {
        super();
        this.state = {
            questionResult: ''
        }
    }

    componentDidMount() {
        axios.post('http://localhost:5000/api/newquestion')
        .then(response => {
            console.log(response)
            this.setState({questionResult: response.data})
        })
        .catch(error => {
            console.log(error);
        })
    }

    render() {
        const {questionResult} = this.state

        return (
            <div>
                <h1>{questionResult}</h1>
            </div>
        )
    }
}

烧瓶端点(这只是一个测试模型,我现在正尝试返回问题本身):

from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route("/api/newquestion", methods=['GET', 'POST'])
def get_user_question():
    if request.method == 'POST':
        user_question = request.get_json()
        print(user_question)
    return jsonify(user_question)

app.run(port=5000, debug=True)

这是我从python控制台获得的信息:

127.0.0.1 - - [20/Nov/2019 23:01:12] "OPTIONS /api/newquestion HTTP/1.1" 200 -
None
127.0.0.1 - - [20/Nov/2019 23:01:12] "GET /api/newquestion HTTP/1.1" 200 -
{'question': 'aaaa'}
127.0.0.1 - - [20/Nov/2019 23:01:13] "POST /api/newquestion HTTP/1.1" 200

但是,当我导入另一个函数test.py时:

def hello():
    return "hi there!"

并将端点更改为:

@app.route("/api/newquestion", methods=['GET', 'POST'])
def get_user_question():
    return hello()

我可以看到消息“嗨,那里!”成功呈现在我的React页面上。

2 个答案:

答案 0 :(得分:1)

由于CORS政策,您没有得到服务器响应。简而言之,除非服务器允许,否则浏览器在默认情况下不会通过添加特定的响应标头来向具有与页面不同的端口,协议或域的任何地址发出ajax请求。

在您的情况下,意味着您的react应用无法与在其他端口上运行的Flask服务器通信,但是您可以对flask配置进行一些更改,以允许跨域请求。有一些可用的软件包,例如https://enable-cors.org/server_flask.html

答案 1 :(得分:0)

const config = {
            headers: {'Access-Control-Allow-Origin': '*'}
        };

        axios.post('http://localhost:5000/api/newquestion', this.state, config)
        .then(response => {
            console.log(response)
            this.setState({questionResult: response.data,            isLoaded: true})
        })
        .catch(error => {
            console.log(error)
        })

@app.route("/api/newquestion", methods=['POST'])
@cross_origin(origin='*',headers=['Content-Type'])
def get_user_question():
    data = request.get_json()
    question = data['question']
    result = generate_text(question)
    return jsonify(result)