web-dev-qa-db-fra.com

Écriture du corps de réponse avec BaseHTTPRequestHandler

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
25
helios

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"))
30
spicavigo

Pour Python 3, préfixez les littéraux de chaîne avec un b:

self.wfile.write(b"<foo>bar</foo>")
5
Jeenu

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
3
user1054340

Utilisez-le simplement dans python3.X

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