Mon application Tornado accepte les données POST via une requête de corps http.
Dans mon gestionnaire, je peux obtenir la demande
def post(self):
data = self.request.body
Les données que je reçois sont dans le début de str (dictionnaire)
Existe-t-il un moyen de recevoir ces données sous la forme d'un dictionnaire Python?
Je ne veux pas utiliser eval
sur le côté serveur pour convertir cette chaîne en dictionnaire Python.
En guise d'alternative à la réponse d'Eloim, Tornado fournit tornado.escape pour "HTML, JSON, URLs, etc." Son utilisation devrait vous donner exactement ce que vous voulez:
data = tornado.escape.json_decode(self.request.body)
Vous recevez une chaîne JSON . Décodez-la avec le module JSON.
import json
def post(self):
data = json.loads(self.request.body)
Pour plus d'informations: http://docs.python.org/2/library/json.html
Je pense avoir eu un problème similaire lors de l'analyse syntaxique des demandes dans Tornado. Essayez d’utiliser le module urllib.unquote_plus:
import urllib
try:
import simplejson as json
except ImportError:
import json
data = json.loads(urllib.unquote_plus(self.request.body))
Mon code devait être préparé pour les deux formats de demande, alors j'ai fait quelque chose comme:
try:
json.loads(self.request.body)
except:
json.loads(urllib.unquote_plus(self.request.body))
Si vous utilisez WebApp2, il utilise ses propres extras json. (Decode) http://webapp2.readthedocs.io/en/latest/_modules/webapp2_extras/json.html
data = json.decode(self.request.body)
v = data.get(key)
self.response.write(v)
Par exemple, ma clé de publication est 'postvalue'
data = json.decode(self.request.body)
v = data.get('postvalue')
self.response.write(v)
que diriez-vous
bind_args = dict((k,v[-1] ) for k, v in self.request.arguments.items())