簡體   English   中英

Python Flask發布並返回json對象

[英]Python Flask post and return json objects

如果這對我來說是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'

`

您對代碼有幾個問題。 首先,當您從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請求的方式,我可以看看。

如果這可以解決您的問題,請告訴我!

您應該檢查文件Flask請求

它沒有定義一個體,而是你應該嘗試

request.get_json()

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

有關詳細信息,請參閱request.get_json()方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM