Tengo el siguiente código:

application = tornado.web.Application([
    (r"/get(.*)", GetHandler),
])

class GetHandler(tornado.web.RequestHandler):
    def get(self, key):
        response = {'key': key}
        self.write(response)

Cuando voy a localhost:port/get?key=python recibo un valor de clave vacío {'key': ''}. ¿Que esta mal aquí?

5
Rudziankoŭ 13 nov. 2017 a las 20:23

2 respuestas

La mejor respuesta

(r"/get(.*)", GetHandler) esto coincidirá con cualquier cosa seguida de /get, ejemplo:

/get
/getsomething
/get/something
/get.asldfkj%5E&(*&fkasljf

Entonces, digamos que llega una solicitud en localhost:port/get/something, entonces el valor del argumento key en GetHandler.get(self, key) será /something (sí, incluida la barra oblicua porque coincide con { {X4}} que significa coincidir con todo).

Pero si llega una solicitud en localhost:port/get?key=python, el valor del argumento key en GETHandler.get(self, key) será una cadena vacía. Sucede porque la parte que contiene ?key=python se llama Query String. No forma parte de la ruta de la URL. Tornado (o casi cualquier otro framework web) no pasa esto a la vista como argumento.


Hay dos formas de cambiar su código:

  1. Si desea acceder a su vista de esta manera: localhost:port/get?key=python, deberá realizar cambios en la configuración de su URL y en su vista:

    application = tornado.web.Application([
        (r"/get", GetHandler),
    ])
    
    class GetHandler(tornado.web.RequestHandler):
        def get(self):
            key = self.get_argument('key', None)
            response = {'key': key}
            self.write(response)
    
  2. Si no desea cambiar la configuración de la URL de su aplicación y su vista, deberá realizar la solicitud de esta manera: localhost:port/get/python.
    Pero aún así necesitará hacer un pequeño cambio en la configuración de su URL. Agregue una barra - / - entre get y (.*), porque de lo contrario el valor de la clave sería /python en lugar de python.

    application = tornado.web.Application([
        (r"/get/(.*)", GetHandler), # note the slash
    ])
    
6
xyres 14 nov. 2017 a las 10:44

Espero que se dé cuenta de lo que hizo mal por sí mismo; es una tarea para usted.

Tu código de trabajo:

import tornado.ioloop
import tornado.web

class GetHandler(tornado.web.RequestHandler):
    def get(self):
        response = self.get_arguments("key")
        if len(response) == 0:
            # Handle me
            self.set_status(400)
            return self.finish("Invalid key")
        self.write({"key":self.get_argument("key")})


def make_app():
    return tornado.web.Application([
        (r"/", GetHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
0
Bartosz Jędrecki 15 dic. 2018 a las 04:39