Мне нужно написать серверную программу на Python, обслуживающую веб-страницы и обрабатывающую другие запросы GET и POST к клиенту и от него. Я новичок в серверах в Python, поэтому я просмотрел несколько примеров, и через некоторое время у меня был базовый c Requesthandler, запущенный с некоторой маршрутизацией к моим страницам в качестве начала. Маршрутизация работала в браузере, и там отображались страницы, но я получил только текст, без стилей, без картинок. Затем я посмотрел немного дальше и понял, что мне также нужно обрабатывать запросы GET для этих файлов. css,. js,. Jpg. Итак, я сделал это и в итоге получил что-то вроде этого:
class Serv(BaseHTTPRequestHandler):
def do_GET(self):
#route incoming path to correct page
if self.path in("","/"):
self.path = "/my_site/index.html"
#TODO do same for every page in the site
if self.path == "/foo":
self.path = "/my_site/fooandstuff.html"
if self.path == "/bar":
self.path = "/my_site/subdir/barfly.html"
try:
sendReply = False
if self.path.endswith(".html"):
mimetype = "text/html"
sendReply = True
if self.path.endswith(".jpg"):
mimetype = "image/jpg"
sendReply = True
if self.path.endswith(".js"):
mimetype = "application/javascript"
sendReply = True
if self.path.endswith(".css"):
mimetype = "text/css"
sendReply = True
if sendReply == True:
f = open(self.path[1:]).read()
self.send_response(200)
self.send_header('Content-type',mimetype)
self.end_headers()
self.wfile.write(f.encode(mimetype))
return
except IOError:
self.send_error(404, "File not found %s" % self.path)
Когда я запускаю это и запрашиваю страницу, я получаю следующий LookupError:
File "d:/somedir/myfile.py", line 47, in do_GET
self.wfile.write(f.encode(mimetype))
LookupError: unknown encoding: text/html
, если я изменяю текст / html до utf-8, это, кажется, «решает» проблему, но затем я сталкиваюсь с тем же Lookuperror, но на этот раз для image / jpg и так далее. Кажется, что wfile.write принимает только utf-8, хотя, когда я осматриваюсь, я вижу людей, передающих file.read () точно так же, как wfile.write
wfile.write(file.read())
и для них это кажется Работа. Тем не менее, когда я это делаю, я получаю
File "C:\Users\myuser\AppData\Local\Programs\Python\Python37\lib\socketserver.py", line 799, in write
self._sock.sendall(b)
TypeError: a bytes-like object is required, not 'str'
Что может вызвать это?