Написание тела ответа с помощью BaseHTTPRequestHandler - PullRequest
24 голосов
/ 04 октября 2011

Я немного играю с Python 3.2.2 и хочу написать простой веб-сервер для удаленного доступа к некоторым данным.Эти данные будут сгенерированы Python, поэтому я не хочу использовать SimpleHTTPRequestHandler, поскольку это файловый сервер, но мой собственный обработчик.

Я скопировал несколько примеров из Интернета, но застрял, потому что outputtream ответа отказывается записывать содержимое тела .

Это мой код:

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

Каким должен быть правильный код для написания тела ответа?

Большое спасибо.

Редактировать:

Ошибка:

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

Ответы [ 4 ]

28 голосов
/ 04 октября 2011

В Python3 строка другого типа, чем в Python 2.x. Преобразуйте его в байты, используя

self.wfile.write(bytes("<html><head><title>Title goes here.</title></head>","utf-8") 

или

self.wfile.write("<html><head><title>Title goes here.</title></head>".encode("utf-8"))
5 голосов
/ 09 июня 2016

Для Python 3 префикс строковых литералов: b:

self.wfile.write(b"<foo>bar</foo>")
3 голосов
/ 19 ноября 2011

на основе вашего кода #comments вы, вероятно, ищете self.headers.getheaders ('referer'), то есть:

if 'http://www.icamefromthissite.com/' in self.headers.getheaders('referer'):
    do something
1 голос
/ 23 августа 2017

Просто используйте это в python3.X

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