Python Flask post 和 return json 对象

Python Flask post and return json objects

抱歉,如果这看起来很简陋,因为我是 Python 的新手。我要完成的任务是将 json 对象从 iPhone 应用程序发送到将处理条带付款的 python 脚本。我遇到的问题是我无法弄清楚如何让 Python 识别传入的 json 对象以从中提取数据并传递到 Stripe。

我已经退后一步来简化问题。我有一个 python 脚本,它尝试 post 一个具有四个值对的 json 对象到另一个应该提取值的函数,创建一个新的 json 对象和 return 那个对象。我无法让它工作,任何帮助将不胜感激,因为我已经坚持了一段时间。我正在使用烧瓶:

`
import json
import stripe
import smtplib
import requests

from flask import Flask, request, jsonify

@application.route('/run_post')
def run_post():
    url = 'http://xxx.pythonanywhere.com/stripetest'
    data = {'stripeAmount': '199', 'stripeCurrency': 'USD', 'stripeToken': '122', 'stripeDescription': 'Test post'}
    headers = {'Content-Type' : 'application/json'}

    r = requests.post(url, data, headers=headers)

    #return json.dumps(r.json(), indent=4)
    return r.text

@application.route('/stripetest', methods=["POST"])
def stripeTest():

    if request.method == "POST":

        json_dict = json.loads(request.body.raw)

        stripeAmount = json_dict['stripeAmount']
        stripeCurrency = json_dict['stripeCurrency']
        stripeToken = json_dict['stripeToken']
        stripeDescription = json_dict['stripeDescription']

        data = "{'stripeAmountRet': " +  stripeAmount + ", 'stripeCurrencyRet': " + stripeCurrency + ", 'stripeTokenRet': " + stripeToken + ", 'stripeDescriptionRet': " + stripeDescription + "}"

        return jsonify(data)
    else:

        return """<html><body>
        Something went horribly wrong
        </body></html>"""

`

当我 运行 这样做时,我在错误日志中得到以下 returned:

`

2015-03-19 21:07:47,148 :Starting new HTTP connection (1): xxx.pythonanywhere.com
    2015-03-19 21:07:47,151 :Exception on /stripetest [POST]
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1687, in wsgi_app
        response = self.full_dispatch_request()
      File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1360, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1358, in full_dispatch_request
        rv = self.dispatch_request()
      File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1344, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
      File "/var/www/xxx_pythonanywhere_com_wsgi.py", line 156, in stripeTest
        json_dict = json.loads(request.body.raw)
      File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 336, in __getattr__
        return getattr(self._get_current_object(), name)
    AttributeError: 'Request' object has no attribute 'body'

`

你应该检查文档Flask requests

它没有定义主体,相反你应该尝试

request.get_json()

您只需确保指定正确的 mimetype,即 "application/json"。

有关详细信息,请参阅 request.get_json() method

您的代码有几个问题。首先,当您从 requests 库发出请求时,您需要正确定义 json 数据。您可以按如下方式执行此操作:

@application.route('/run_post')
def run_post():
    url = 'http://xxx.pythonanywhere.com/stripetest'
    data = {'stripeAmount': '199', 'stripeCurrency': 'USD', 'stripeToken': '122', 'stripeDescription': 'Test post'}
    headers = {'Content-Type' : 'application/json'}

    r = requests.post(url, data=json.dumps(data), headers=headers)

    #return json.dumps(r.json(), indent=4)
    return r.text

请注意,我们调用 json.dumps 而不是直接传递数据。否则,传入请求不会被解释为 json 数据。

接下来,在你的接收函数中,我们修改如下:

@application.route('/stripetest', methods=["POST"])
def stripeTest():

    if request.method == "POST":
        json_dict = request.get_json()

        stripeAmount = json_dict['stripeAmount']
        stripeCurrency = json_dict['stripeCurrency']
        stripeToken = json_dict['stripeToken']
        stripeDescription = json_dict['stripeDescription']


        data = {'stripeAmountRet': stripeAmount, 'stripeCurrencyRet': stripeCurrency, 'stripeTokenRet': stripeToken, 'stripeDescriptionRet': stripeDescription}
        return jsonify(data)
    else:

        return """<html><body>
        Something went horribly wrong
        </body></html>"""

一些事情发生了变化。首先,我们通过调用 request.get_json() 来读取数据,它会正确解析传入的 json 数据。请注意,从上面我们需要更改实际发出请求的方式,以便正确解析数据。下一个问题是如何 return 编辑数据。为了将数据 jsonify 正确地 return,我们将数据放入 python 字典而不是字符串。

如果您正在调用您的函数来处理来自其他地方的条带支付(即不使用 python requests 库),另一个问题是您可能没有定义 json 正确请求 Flask 稍后解释。如果对处理函数进行上述更改后问题仍然存在,post你是如何在其他地方发出json请求的,我可以看看。

如果这能解决您的问题,请告诉我!