如果这看起来很初级,我很抱歉,因为我是 Python 新手。我试图完成的任务是将一个 json 对象从 iPhone 应用程序发送到将处理 strip 支付的 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'
`
最佳答案
您的代码有几个问题。首先,当您从 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
请注意,我们调用
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 字典而不是字符串中。如果您正在调用您的函数来处理来自其他地方的 strip 支付(即不使用 python
requests
库),另一个问题是您可能没有正确定义 json
请求以供 Flask 稍后解释。如果对处理函数进行上述更改后问题仍然存在,请在其他地方发布您如何发出 json
请求,我可以查看一下。如果这能解决您的问题,请告诉我!
关于Python Flask 发布并返回 json 对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29155339/