2015-09-13 3 views
0

Я пытаюсь выяснить, как получить данные в формате JSON POST в Python 2.7 с установкой CherryPy, которая служит как HTML и JSONКак получить данные запроса JSON POST в CherryPy в питона 2,7

Я использую этот скрипт для отправки демо JSON запрос

import urllib2 
import json 

def mytest(): 

    d = { 
    'hello': '1', 
    'world': '2' 
    } 

    print(json.dumps(d)) 
    URL = 'http://localhost:8092/json_in' 
    print(URL) 
    post_data = json.dumps(d) 

    req = urllib2.Request(URL, post_data) 
    RESULT = urllib2.urlopen(req).read() 
    print(RESULT) 

if __name__ == '__main__': 
    mytest() 

CherryPy сторона работает как этот

# -*- coding: utf-8 -*-^ 
import cherrypy 
class WelcomePage: 
    def index(self): 
     return "<html><body>hello world</body><html>" 
    index.exposed = True 

    def json_in(self,**kwargs): 
     print kwargs 

     # this is dumb but works to grab the first and only argument 
     for key,value in kwargs.iteritems(): 
     myjson = key 

     parsed_json = json.loads(myjson) 
     print(parsed_json['hello']) 


     return "{}" 

    json_in.exposed = True 


if __name__ == '__main__': 
    cherrypyconf = "cherrypy.conf" 
    cherrypy.quickstart(WelcomePage(),config=cherrypyconf) 

Когда я запустить сервер и отправить запрос я могу видеть мою просьбу в (из консул печати команды), но строка синтаксического анализа завершается с ошибкой TypeError : ожидается строка или буфер

Любой намек, как это исправить?

UPDATE:

Проблема, кажется, что я не понимаю, как обращаться с ** kwargs. Обновленный код работает (но использует очень тупой способ извлечь JSON, пока я не найду правильный синтаксис, чтобы получить первый аргумент)

ответ

1

Вы не набираете преимущество некоторых из сборки в инструментах, CherryPy предложения и клиентский код не указывает правильный тип контента.

клиентский код должен выглядеть следующим образом: (обратите внимание на заголовок типа контента):

import urllib2 
import json 

def mytest(): 

    d = { 
    'hello': '1', 
    'world': '2' 
    } 

    print(json.dumps(d)) 
    URL = 'http://localhost:8092/json_in' 
    print(URL) 
    post_data = json.dumps(d) 

    req = urllib2.Request(URL, post_data, headers={ 
    'Content-Type': 'application/json' 
    }) 
    RESULT = urllib2.urlopen(req).read() 
    print(RESULT) 

if __name__ == '__main__': 
    mytest() 

и код сервера так:

# -*- coding: utf-8 -*- 
import cherrypy as cp 


class WelcomePage: 

    @cp.expose 
    def index(self): 
     return "<html><body>hello world</body><html>" 

    @cp.expose 
    @cp.tools.json_in() 
    @cp.tools.json_out() 
    def json_in(self): 
     print(cp.request.json['hello']) 
     return {} 


if __name__ == '__main__': 
    cherrypyconf = "cherrypy.conf" 
    cp.quickstart(WelcomePage(),config=cherrypyconf) 
+0

Спасибо. Сначала я попробовал этот подход на стороне сервера, но затем все страницы были обработаны JSON-like. Возможно, использование «@ cp.expose» на каждой странице будет работать лучше (клиент - это только реальный манекен, который я использовал для тестирования) Может быть, я должен попробовать это снова ... – 576i

+0

Протестировано и работает. Однако факт заключается в том, что изменение с измененным клиентом старый сервер перестает распознавать запрос JSON. – 576i

+0

Вы можете указать другой допустимый тип содержимого на декораторе 'json_in'. Как текст/html. Проверьте документы: http://docs.cherrypy.org/en/latest/pkg/cherrypy.lib.html?highlight=json#cherrypy.lib.jsontools.json_in. '@ cp.expose' только устанавливает свойство' visible', поэтому оно не связано с обработкой json. Это может помочь вам узнать больше о вишневых инструментах и ​​настройках, возможно, вы сможете это сделать в разделах Configure and Extend http://docs.cherrypy.org. – cyraxjoe