2011-10-04 16 views
24

Sto giocando un po 'con Python 3.2.2 e voglio scrivere un semplice web server per accedere ad alcuni dati in remoto. Questi dati saranno generati da Python quindi non voglio usare SimpleHTTPRequestHandler dato che è un file server, ma un mio gestore personale.Scrittura del corpo di risposta con BaseHTTPRequestHandler

Ho copiato alcuni esempi da Internet ma sono bloccato perché la risposta outputstream si rifiuta di scrivere il contenuto del corpo.

Questo è il mio codice:

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() 

quello che dovrebbe essere un codice corretto per la scrittura del corpo della risposta?

Grazie mille.

Edit:

L'errore è:

... 
    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

Ammetto che non ho le basi in Python :) quindi sono un po 'perso cercando di capire come lavorare con i tipi e gli strumenti per trasformarli ... – helios

+0

dove si trova questa riga nel tuo codice? self.wfile.write (prueba) – spicavigo

+0

Oops, mi dispiace. Questa è la traccia di un altro test (prueba = test). Lo aggiusterò. – helios

risposta

26

Nella stringa python3 è un tipo diverso da quello in Python 2.x. Fusioni in byte utilizzando

bytes(s, "utf-8") 

o

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

Grande. Ora penso che se c'è un modo per avvolgere un output in un "printwriter" (sì, io sono un programmatore Java), hehehe. Cerchiamo qualcosa (o semplicemente definiamo una semplice funzione di conversione) – helios

+3

Ho provato con la trasformazione di stringa .encode() per Python 3 ma c'è ancora un errore. Devi rimuovere l'ultima riga: self.wfile.close() perché do_GET chiuderà e svuota il flusso da solo. –

2

in base alle vostre #commenti codice che probabilmente stai cercando self.headers.getheaders ('referer'), vale a dire:

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

Beh, non proprio. Volevo solo controllare a livello di codice l'output della risposta. La risposta approvata è ciò di cui avevo bisogno. Per codificare le stringhe in byte per inviare i byte alla risposta. Grazie comunque! – helios

3

Per Python 3, precedere le stringhe con un b:

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

Questa è la soluzione più pulita qui, bello! Puoi confermare che questo valore di default per enfatizzare utf-8? –

0

Basta utilizzare questo in python3.X

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