Je joue un peu avec Python 3.2.2 et je veux écrire un simple serveur Web pour accéder à certaines données à distance. Ces données seront générées par Python donc je ne veux pas utiliser SimpleHTTPRequestHandler car c'est un serveur de fichiers, mais un propre gestionnaire.
J'ai copié un exemple sur Internet mais je suis bloqué parce que le flux de sortie de réponse refuse d'écrire le contenu du corps.
Voici mon code:
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()
Quel devrait être un code correct pour écrire le corps de la réponse?
Merci beaucoup.
Modifier:
L'erreur est:
...
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
En Python3, la chaîne est d'un type différent de celui de Python 2.x. Convertissez-le en octets en utilisant soit
self.wfile.write(bytes("<html><head><title>Title goes here.</title></head>","utf-8")
ou
self.wfile.write("<html><head><title>Title goes here.</title></head>".encode("utf-8"))
Pour Python 3, préfixez les littéraux de chaîne avec un b
:
self.wfile.write(b"<foo>bar</foo>")
en fonction de votre code #comments, vous recherchez probablement self.headers.getheaders ('referer'), c'est-à-dire:
if 'http://www.icamefromthissite.com/' in self.headers.getheaders('referer'):
do something
Utilisez-le simplement dans python3.X
self.wfile.write(bytes("<body><p>This is a test.</p>", "utf-8")