2013-05-08 14 views
18
aplikacja

My Tornado akceptuje dane POST poprzez żądanie ciała httpTornado request.body

W moim obsługi Jestem w stanie uzyskać żądania

def post(self): 
    data = self.request.body 

Dane jestem coraz to w od STR (słownik)

Czy istnieje sposób na otrzymanie tych danych w postaci słownika Python?

Nie chcę używać eval po stronie serwera, aby przekonwertować ten ciąg na słownik Python.

+0

To chyba ciąg JSON. – Blender

+0

Czy istnieje sposób przekonwertowania tego łańcucha json do słownika Pythona bez użycia eval. –

+0

Ten ciąg jsonów zawiera spacje, które nie obsługują innych bibliotek json w celu przekształcenia go w python dictionar. –

Odpowiedz

16

Otrzymujesz ciąg znaków JSON. dekodować go z modułem JSON

import json 

def post(self): 
    data = json.loads(self.request.body) 

o więcej informacji: http://docs.python.org/2/library/json.html

+12

w Pythonie 3 musisz rozszyfrować oryginalny bytestring, np. 'json.loads (self.request.body.decode ('utf-8'))' –

+1

Możesz teraz użyć 'tornado.escape.json_decode (self.request.body)', który zajmie się dla Ciebie dekodowaniem. –

+0

Zauważ, że użycie 'wrapperów tornado.escape' do' json.loads' oznacza, że ​​nie będziesz w stanie spersonalizować/przesłonić 'JSONDecoder' za pomocą' cls' lub 'parsować _...' kwargs. (To jest o wiele trudniejszy problem z używaniem komplementarnego 'tornado.escape.json.encode', który otacza' json.dumps', ale wciąż warto o tym wspomnieć.) – cowbert

1

Chyba miał podobny problem, kiedy analizowania wniosków w Tornado. Spróbuj użyć modułu urllib.unquote_plus:

import urllib 
try: 
    import simplejson as json 
except ImportError: 
    import json 


data = json.loads(urllib.unquote_plus(self.request.body)) 

Mój kod miał być przygotowany zarówno dla różnych formatów zamówienie, więc zrobiłem coś takiego:

try: 
    json.loads(self.request.body) 
except: 
    json.loads(urllib.unquote_plus(self.request.body)) 
+0

Jestem ciekawa, jaka była odpowiedź, więc daj mi znać, jeśli to pomogło (lub jeśli wymyśliłeś to na czacie). Jestem prawie pewien, że było tak dlatego, że był kodowany przez URL. – Mitch

+0

Escaping pomógł mi tutaj. – RandomInsano

+0

Dla python3 jest to 'urllib.parse.unquote_plus()' – NuclearPeon

25

Jako alternatywę dla odpowiedzi Eloim za Tornado zapewnia tornado.escape dla "Wyskakujących/oddalonych od HTML, JSON, URL i innych". Korzystanie z niego powinno dać ci dokładnie, co chcesz:

data = tornado.escape.json_decode(self.request.body) 
-1

najlepszy sposób dla mnie do analizowania ciała w tornado wbudowanym httputil
Dobrej pracy z wejścia wielofunkcyjnego (jak pole wyboru, stoły, itd.). Jeśli elementy przesyłania mają taką samą nazwę w słowniku zwracającym listę wartości.

próbka robocza:

import tornado.httputil  

    def post(self): 
     file_dic = {} 
     arg_dic = {} 

     tornado.httputil.parse_body_arguments('application/x-www-form-urlencoded', self.request.body, arg_dic, file_dic) 

    print(arg_dic, file_dic) # or other code` 
0

jak o

bind_args = dict((k,v[-1]) for k, v in self.request.arguments.items()) 
+0

Podczas gdy ten kod może odpowiedzieć na pytanie, podanie dodatkowego kontekstu dotyczącego tego, jak i/lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. –