[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