2011-10-04 19 views
24

Estoy jugando un poco con Python 3.2.2 y quiero escribir un servidor web simple para acceder a algunos datos de forma remota. Python generará estos datos, por lo que no quiero usar SimpleHTTPRequestHandler ya que es un servidor de archivos, sino un controlador propio.Cuerpo de respuesta de escritura con BaseHTTPRequestHandler

He copiado algunos ejemplos de Internet, pero estoy atascado porque la respuesta outputtream se niega a escribir el contenido del cuerpo.

Este es mi código:

import http.server 
import socketserver 

PORT = 8000 

class MyHandler(http.server.BaseHTTPRequestHandler): 
    def do_HEAD(self): 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 
    def do_GET(self): 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 
     print(self.wfile) 
     self.wfile.write("<html><head><title>Title goes here.</title></head>") 
     self.wfile.write("<body><p>This is a test.</p>") 
     # If someone went to "http://something.somewhere.net/foo/bar/", 
     # then s.path equals "/foo/bar/". 
     self.wfile.write("<p>You accessed path: %s</p>" % self.path) 
     self.wfile.write("</body></html>") 
     self.wfile.close() 

try: 
    server = http.server.HTTPServer(('localhost', PORT), MyHandler) 
    print('Started http server') 
    server.serve_forever() 
except KeyboardInterrupt: 
    print('^C received, shutting down server') 
    server.socket.close() 

Lo que debería haber un código correcto para escribir el cuerpo de la respuesta?

Muchas gracias.

Editar:

El error es:

... 
    File "server.py", line 16, in do_GET 
    self.wfile.write("<html><head><title>Title goes here.</title></head>") 
    File "C:\Python32\lib\socket.py", line 297, in write 
    return self._sock.send(b) 
TypeError: 'str' does not support the buffer interface 
+0

que admitir que no tiene los fundamentos en Python :) así que estoy un poco perdido tratando de encontrar la manera de trabajar con los tipos y las herramientas para su transformación ... – helios

+0

¿dónde está esta línea en tu código? self.wfile.write (prueba) – spicavigo

+0

Oops, lo siento. Esa es la huella de otra prueba (prueba = prueba). Lo arreglaré. – helios

Respuesta

26

En cadena python3 es un tipo diferente de aquel en Python 2.x. Echó en bytes utilizando

bytes(s, "utf-8") 

o

s.encode("utf-8") 
+0

Genial. Ahora creo que si hay una forma de ajustar un outputtream dentro de un "printwriter" (sí, soy un programador de Java), jejeje. Busquemos algo (o simplemente definamos una función de conversión simple) – helios

+3

Intenté con la transformación de cadena .encode() para Python 3 pero todavía hay un error. Debe eliminar la última línea: self.wfile.close() porque do_GET se cerrará y purgará el flujo por sí mismo. –

2

en función de sus #comentarios código que probablemente en busca de self.headers.getheaders ('árbitro'), es decir:

if 'http://www.icamefromthissite.com/' in self.headers.getheaders('referer'): 
    do something 
+1

Bueno, realmente no. Solo quería controlar programáticamente el resultado de la respuesta. La respuesta aprobada es lo que necesitaba. Para codificar las cadenas en bytes para enviar los bytes a la respuesta. ¡Gracias de cualquier manera! – helios

3

Para Python 3, prefijar los literales de cadena con un b:

self.wfile.write(b"<foo>bar</foo>") 
+0

Esta es la solución más limpia aquí, ¡lindo! ¿Puedes confirmar que esto defade a utod-8? –

0

sólo tiene que utilizar esto en python3.X

self.wfile.write(bytes("<body><p>This is a test.</p>", "utf-8") 
Cuestiones relacionadas