首页 > 解决方案 > Flask 只接受单个 json 变量并在设置两个变量时崩溃

问题描述

我正在 Google App Engine 上构建一个网络爬虫应用程序。我想使用 post 方法将变量传递给 Flask。然后,接收到的变量成为我的网络爬虫应用程序的输入。但是,Flask 只接受来自 post 的单个变量。如果我在函数中添加另一个变量,Flask 会崩溃。

我对 Flask 和 Google 应用引擎的了解有限。我为这个问题苦苦挣扎了好几天,我们将非常感谢您的帮助。

失败的功能

#server-side function that does not work,with 2 variable passed
@app.route('/bac',methods=['GET', 'POST'])
def bac():
    request_json = request.get_json()
    filename = request_json["filename"]
    url = request_json["url"]
    #baseconnect.Baseconnect(url=url,filename=filename).run()
    return filename,url

#The function to post on client side

import requests
req = requests.Session()
data = req.post('https://project.appspot.com/bac',json={"filename":"yuan","url":"https:...f5"})
print(data.text)

#output:
 Internal server eror 500

成功的功能

#server-side function that works,with 1 variable passed
@app.route('/bac',methods=['GET', 'POST'])
def bac():
    request_json = request.get_json()
    filename = request_json["filename"]
    #url = request_json["url"]
    #baseconnect.Baseconnect(url=url,filename=filename).run()
    return filename

#The function to post on client side

import requests
req = requests.Session()
data = req.post('https://project.appspot.com/bac',json={"filename":"yuan"})
print(data.text)
#output:
 yuan

Flask 似乎只接受单个变量。问题是什么....

标签: google-app-engineflaskinternal-server-error

解决方案


您在这里遇到的问题是 Flask 只返回Response对象,而 Flask 会return filename, url考虑return Response, status or header.

在这种情况下,url就变成了http状态码或者header,这显然是不对的。

您需要flask.jsonify()返回所谓的“多变量”的正确格式。

像这样的东西:(只有重要的部分)

# In server-side code
from flask import jsonify
@app.route('/bac',methods=['GET', 'POST'])
def bac():
    request_json = request.get_json()
    filename = request_json["filename"]
    url = request_json["url"]
    # Do your logic here
    return jsonify({ filename_returned: filename, url_returned: url })


# client-side
import requests
req = requests.Session()
json_data = req.post('https://project.appspot.com/bac',json={"filename":"yuan", "url": "http:xxxxxxx"})
real_data = json.loads(json_data)
# real_data should be the result you want

推荐阅读