2011-10-04 12 views
24

Piszę trochę z Pythonem 3.2.2 i chcę napisać prosty serwer WWW, aby uzyskać zdalny dostęp do niektórych danych. Te dane będą generowane przez Python, więc nie chcę używać SimpleHTTPRequestHandler, ponieważ jest to serwer plików, ale mój program obsługi.Zapisywanie treści odpowiedzi za pomocą BaseHTTPRequestHandler

Skopiowałem przykład z Internetu, ale utknąłem ponieważ strumień wyjściowy odpowiedzi odmawia napisania treści treści.

To jest mój kod:

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

Jaki powinien być prawidłowy kod do pisania ciało odpowiedzi?

Wielkie dzięki.

Edit:

Błąd jest:

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

muszę przyznać, że nie mają podstaw w Pythonie :) więc jestem trochę zagubiony próbuje dowiedzieć się, jak pracować z typami i narzędzi do ich przekształcania ... – helios

+0

gdzie jest ta linia w twoim kodzie? self.wfile.write (prueba) – spicavigo

+0

Ups, przepraszam. To jest ślad z innego testu (prueba = test). Naprawię to. – helios

Odpowiedz

26

W Python3 ciąg jest innego typu niż w Pythonie 2.x. Wrzucił je w bajtach stosując albo

bytes(s, "utf-8") 

lub

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

Świetnie. Teraz myślę, że jeśli istnieje sposób na owijanie strumienia danych wyjściowych w "drukowanie" (tak, jestem programistą Java), hehehe. Poszukajmy czegoś (lub po prostu zdefiniujmy prostą funkcję konwersji). – helios

+3

Próbowałem z transformacją ciągów .encode() dla Pythona 3, ale nadal występuje błąd. Musisz usunąć ostatnią linię: self.wfile.close() , ponieważ do_GET zamknie i opróżni strumień samodzielnie. –

2

oparciu o #comments kodowych pewnie szukają self.headers.getheaders ('Referer'), a mianowicie:

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

Cóż, niezupełnie. Chciałem jedynie sterować programowo wyjściem z odpowiedzi. Zatwierdzona odpowiedź jest tym, czego potrzebowałem. Aby zakodować ciągi w bajtach, aby wysłać bajty do odpowiedzi. Dzięki i tak! – helios

3

dla Pythona 3, prefiks literały ciągów z b:

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

To jest najczystsze rozwiązanie tutaj, miło! Czy możesz potwierdzić, że domyślnie jest to kodowanie utf-8? –

0

Wystarczy użyć tego w python3.X

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