2012-04-10 18 views
6

Necesito implementar una aplicación muy simple similar a un servidor web en Python que realizaría solicitudes y respuestas HTTP básicas y mostraría resultados muy básicos en la página web. No estoy demasiado preocupado por la codificación en Python, pero no estoy seguro de por dónde empezar? ¿Cómo configurar esto? Un archivo? ¿Múltiples archivos? Supongo que no tengo ni idea de cómo abordar el hecho de que este es un "servidor", por lo que no estoy familiarizado con la forma de abordar el tratamiento de las solicitudes HTTP/sockets/solicitudes de procesamiento, etc. ¿Algún consejo? Recursos?¿Cómo puedo implementar un servidor web simple usando Python sin usar ninguna biblioteca?

+0

Explique aún más sus requisitos (y por qué). ¿Desea implementar la pila completa de nivel de aplicación o puede usar, p. ¿Apache? Explique más lo que necesita * Y por qué. * Finalmente, cuando tiene la etiqueta "websocket", ¿lo dice en serio o simplemente era una etiqueta incorrecta para usar? –

+2

Sin usar * cualquier * bibliotecas? Seguramente 'socket' va a ser necesario como mínimo? – geoffspear

+0

revise la página [esta documentación] (http://docs.python.org/library/simplehttpserver.html), aquí supongo que "cualquier biblioteca" son bibliotecas que no están incluidas en la instalación de python. –

Respuesta

2

Puede usar socket programming para este fin. El siguiente fragmento crea un socket TCP y escucha en el puerto 9000 para solicitudes http:

from socket import * 

def createServer(): 
    serversocket = socket(AF_INET, SOCK_STREAM) 
    serversocket.bind(('localhost',9000)) 
    serversocket.listen(5) 
    while(1): 
     (clientsocket, address) = serversocket.accept() 
     clientsocket.send("HTTP/1.1 200 OK\n" 
     +"Content-Type: text/html\n" 
     +"\n" # Important! 
     +"<html><body>Hello World</body></html>\n") 
     clientsocket.shutdown(SHUT_WR) 
     clientsocket.close() 

    serversocket.close() 

createServer() 

iniciar el servidor, $ python server.py. Abra http://localhost:9000/ en su navegador web (que actúa como cliente). Luego, en la ventana del navegador, puede ver el texto "Hello World" (respuesta http).

EDITAR ** El código anterior fue probado sólo en el cromo, y como ustedes sugirieron sobre otros navegadores, el código se modificó como:

  1. para que la respuesta http-por igual puede enviar de manera clara encabezado con http versión 1.1, código de estado 200 OK y tipo de contenido text/html.
  2. El socket del cliente debe cerrarse una vez que se envía la respuesta ya que es un socket TCP.
  3. Para cerrar adecuadamente el socket de cliente shutdown(), tiene que ser llamado socket.shutdown vs socket.close

continuación, el código fue probado en Chrome, Firefox (http://localhost:9000/) y el rizo sencillo en el terminal (rizar http://localhost:9000).

+2

-1. ¿Has intentado esto? Esto no funciona en absoluto; es un servidor de socket, pero no habla HTTP. – Ashe

+3

En realidad, no habla HTTP, por lo que casi todos los navegadores no funcionarían con esto. No funciona en Chrome. Solo funciona en Firefox si presiona el botón Detener. Este no es un servidor web. – Ashe

+0

He copiado el script que lo ejecutó y me aparece un error que dice 'se requiere un objeto tipo byte no 'str'' ¿cómo puedo solucionarlo? – Simon

8

Debería mirar el módulo SimpleHttpServer (py3: http.server).

Dependiendo de lo que esté tratando de hacer, puede simplemente usarlo o consultar la fuente del módulo (py2, py3) para obtener ideas.

Si desea obtener más bajo nivel, SimpleHttpServer extiende BaseHttpServer (source) para que funcione.

Si desea obtener aún más de bajo nivel, echar un vistazo a SocketServer (fuente: py2, py3).

La gente a menudo ejecutará python como python -m SimpleHttpServer (o python3 -m http.server) si solo quieren compartir un directorio: es un servidor completamente funcional y ... simple.

+0

Probablemente diría que primero debe verificar la documentación HTTP. como RFC. – zinking

Cuestiones relacionadas