【问题标题】:Python Flask post and return json objectsPython Flask 发布并返回 json 对象
【发布时间】:2015-05-23 04:50:37
【问题描述】:

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

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

`
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>"""

`

当我运行此程序时,我在错误日志中返回以下内容:

`

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'

`

【问题讨论】:

    标签: python flask stripe-payments


    【解决方案1】:

    您的代码有几个问题。首先,当您从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 数据。请注意,我们需要更改我们实际发出请求的方式以正确解析数据。下一个问题是您如何返回数据。为了正确jsonify要返回的数据,我们将数据放入python字典而不是字符串。

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

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

    【讨论】:

    • 您好 Jason,感谢您抽出宝贵时间回复。上述解决方案有效,它使我能够继续前进。现在我可以读取传入的 json 对象,我应该能够将它成功链接到我的应用程序。
    【解决方案2】:

    你应该检查文档Flask requests

    它没有定义主体,你应该尝试使用

    request.get_json()
    

    您只需要确保您指定了正确的 mimetype,即“application/json”。

    更多信息请见request.get_json() method

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 2013-06-06
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      相关资源
      最近更新 更多