2015-03-19 3 views
2

Извините, если это кажется рудиментарным, поскольку я новичок в Python. Задача, которую я пытаюсь завершить, - отправить json-объект из приложения iPhone в сценарий python, который обработает платеж по полосе. Проблема у меня есть, я не могу понять, как заставить Python распознавать входящий json-объект для извлечения данных из него и перехода на Stripe.Python Flask post and return json objects

Я сделал шаг назад, чтобы упростить проблему. У меня есть сценарий python, который пытается отправить объект json с четырьмя парами значений в другую функцию, которая должна извлекать значения, создавать новый объект json и возвращать этот объект. Я не могу заставить его работать, и любая помощь будет очень признательна, поскольку я застрял на этом некоторое время. Я использую Настой:

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

`

ответ

9

У вас есть несколько вопросов с кодом. Прежде всего, вам необходимо правильно определить данные 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. Обратите внимание, что нам нужно было изменить то, как мы действительно сделали запрос на его правильное синтаксическое анализ данных. Следующий вопрос: как вы вернули данные. Чтобы правильно вернуть данные, мы помещаем данные в словарь python, а не в строку.

Если вы вызываете вашу функцию для обработки платежа полосы из других (т.е. не с помощью библиотеки Python requests), еще одна проблемы в том, что вы не можете быть определением json запроса правильно для колбы позже интерпретировать. Если проблема по-прежнему сохраняется после внесения вышеуказанного изменения в функцию обработки, сообщите, как вы делаете запрос json в другом месте, и я могу посмотреть.

Сообщите мне, если это устраняет ваши проблемы!

+1

Привет, Джейсон, спасибо, что нашли время ответить. Вышеупомянутое решение сработало, и это позволило мне двигаться вперед.Теперь я могу прочитать входящий json-объект, который должен был бы связать его с моим приложением. – dickiebow

+0

Рад слышать, что все работает сейчас! –

+1

Спасибо .. это помогло мне работать с JSON тоже –

0

Вы должны проверить документ http://flask.pocoo.org/docs/0.10/api/#incoming-request-data

Он не определяет тело, вместо этого вы должны попробовать с

request.get_json() 

Вам просто нужно убедиться, что вы указали правильный тип mimetype, который будет «application/json».

Смотрите request.get_json() method для получения дополнительной информации