[pyar] Duda sobre implementación de BaseHTTPRequestHandler

Daniel Moisset dmoisset en machinalis.com
Mar Mayo 28 13:17:15 ART 2013


Mas alla de las sugerencias de como implementarlo, el problema de instanciar

HTTPServer(('127.0.0.1', 8000), HttpHandler("config.txt")

Es que el inicializador de HTTPServer espera como segundo argumento una
*clase*

o sea, en algun lugar hay codigo del estilo

class HTTPServer:
    def __init__(addr, segundo_argumento):
        ....
        instancia_de_handler = segundo_argumento(x, y, z)

si segundo_argumento es una clase eso anda bien, pero si le pasas una
*instancia* (como haces vos al pasar HttpHandler("config.txt"), la linea
esa dentro del init pasa a ser equivalente a

instancia_de_handler = HttpHandler("config.txt")(x, y, z)

Y ahi se ve claro porque te dice que el objeto no es "callable"

Lo que yo haría respetando el esquema original es lo siguiente:


class HttpHandler(BaseHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        filename = kwargs.pop('filename')
        ... hacer algo con filename ....
        super(HttpHandler, self).__init__(*args, **kwargs)

def http_handler_factory(filename):
    def inner(*args, **kwargs):
        return HttpHandler(*args, filename=filename, **kwargs)
    return inner

server = HTTPServer(('127.0.0.1', 8000), http_handler_factory("config.txt"))

ahi le paso al inicializador de HTTPServer un parametro (inner), que puede
llamar y construye instancias de handler como vos queres

Saludos,
    D.



2013/5/28 Eliseo Ocampos <roskoff en gmail.com>

> Buenas noches gente,
>
>    Estuve trabajando con un script que debe simular a cierto servidor web,
> básicamente tiene que recibir una petición (cualquiera) y retornar un
> archivo cifrado. Intenté hacerlo así y funciona:
>
> class HttpHandler(BaseHTTPRequestHandler):
>     def do_GET(self):
>         self.send_response(200)
>         self.send_header('Access-Control-Allow-Origin', '*')
>         self.send_header('Access-Control-Allow-Headers', 'X-Request,
> X-Requested-With')
>         self.send_header('Content-type', 'application/octet-stream')
>         self.end_headers()
>         encrypted_config = self.cifrar_configuracion()
>         self.wfile.write(encrypted_config)
>
>     def cifrar_configuracion(self):
>         # String de configuracion que se cifra y se retorna
>
> def main():
>     try:
>         server = HTTPServer(('127.0.0.1', 8000), HttpHandler)
>         print("Servidor corriendo en: 127.0.0.1:8000")
>         server.serve_forever()
>     except KeyboardInterrupt:
>         server.socket.close()
>
> if __name__ == '__main__':
>     main()
>
> Mis problemas surgieron cuando quise hacer esto "parametrizable": pasar un
> argumento posicional al script (nombre del archivo que contiene el texto de
> configuración), para lo cual intenté definir __init__(self, filename)
> dentro de la clase HttpHandler, de manera a instanciar el servidor así:
> server = HTTPServer(('127.0.0.1', 8000), HttpHandler("config.txt")
>
> Este fue mi razonamiento obvio, pero luego me surgió el siguiente error:
> TypeError: 'HttpHandler' object is not callable
>
> Por qué no puedo usar __init__ para inicializar la clase con un parámetro
> que necesito? También intenté llamar a super() pero dice que requiere las
> variables request, client_address y server.
>
> Como no di con una solución resolví parsear el path del handler buscando
> el nombre del archivo específico, sin embargo, me quedé con la duda de este
> detalle de implementación.
>
> Saludos!
> Eliseo.
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20130528/9647989f/attachment.html>


More information about the pyar mailing list