web-dev-qa-db-fra.com

Comment utiliser la méthode POST dans Tornado?

J'essaie d'utiliser Tornado pour démarrer un serveur et y poster une chaîne. J'ai trouvé beaucoup d'exemples sur la façon d'écrire la méthode post dans la classe du gestionnaire, mais aucun exemple sur la façon d'écrire la demande de publication. Mon code actuel provoque l'exécution de la méthode post, mais get_argument n'obtient pas les données - il imprime simplement le "Aucune donnée reçue" par défaut à chaque fois. Qu'est-ce que je fais mal?

Mon code ressemble à ceci:

class MainHandler(tornado.web.RequestHandler):
    def post(self):
        data = self.get_argument('body', 'No data received')
        self.write(data)

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":

    def handle_request(response):
        if response.error:
            print "Error:", response.error
        else:
            print response.body
        tornado.ioloop.IOLoop.instance().stop()

    application.listen(8888)    
    test = "test data"
    http_client = tornado.httpclient.AsyncHTTPClient()
    http_client.fetch("http://0.0.0.0:8888", handle_request, method='POST', headers=None, body=test)
    tornado.ioloop.IOLoop.instance().start()

Est-ce que mettre la chaîne que je veux envoyer dans le paramètre "body" est la bonne chose à faire? Dans certains exemples que j'ai vus, comme ici , il semble que les gens créent leurs propres paramètres, mais si j'essaie d'ajouter un nouveau paramètre à la demande, comme

http_client.fetch("http://0.0.0.0:8888", handle_request, method='POST', headers=None, data=test)

Je reçois juste une erreur disant "TypeError: init () a obtenu un argument de mot clé inattendu 'data'"

Merci!

21
user1363445

il semble que les gens créent leurs propres paramètres

Pas assez. De la documentation:

récupérer (demande, ** kwargs)

Exécute une demande, renvoyant une HTTPResponse.

La demande peut être une URL de chaîne ou un objet HTTPRequest. S'il s'agit d'une chaîne, nous construisons une HTTPRequest en utilisant des kwargs supplémentaires: HTTPRequest (request, ** kwargs)

( Lien )

Donc les kwargs sont en fait de cette méthode .

Quoi qu'il en soit, à la vraie chair du problème: Comment envoyez-vous des données POST? Vous étiez sur la bonne voie, mais vous devez url encoder votre POST données et utilisez-les comme votre corps kwarg. Comme ceci:

import urllib
post_data = { 'data': 'test data' } #A dictionary of your post data
body = urllib.urlencode(post_data) #Make it into a post request
http_client.fetch("http://0.0.0.0:8888", handle_request, method='POST', headers=None, body=body) #Send it off!

Ensuite pour obtenir les données:

data = self.get_argument('data', 'No data received')
37
Theron Luhn