Python Flask发布并返回json对象

dic*_*bow 3 python flask stripe-payments

如果这对我来说是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>"""
Run Code Online (Sandbox Code Playgroud)

`

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

`

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'
Run Code Online (Sandbox Code Playgroud)

`

Jas*_*oks 11

您对代码有几个问题.首先,您需要json在从requests库中发出请求时正确定义数据.你可以这样做:

@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
Run Code Online (Sandbox Code Playgroud)

请注意,我们调用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>"""
Run Code Online (Sandbox Code Playgroud)

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

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

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