Python BaseHTTPRequestHandler выдает ошибку поиска на любом объекте, кроме utf-8 - PullRequest
0 голосов
/ 23 апреля 2020

Мне нужно написать серверную программу на 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'

Что может вызвать это?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Ответ был в открытии файла изображения, который нуждался в дополнительном аргументе "rb", например:

        if mimetype != "image/jpg":
            f = open(self.path[1:])
        else:
            f = open(self.path[1:], "rb")

, а затем также:

        if mimetype == "image/jpg": 
            self.wfile.write(f.read())
        else:
            self.wfile.write(f.read().encode("utf-8"))
0 голосов
/ 23 апреля 2020

для обработки сервера с python улучшенный поиск flask пример кода будет выглядеть так:

from flask import Flask, render_template, url_for, request, redirect
import csv

@app.route('/')
def my_home():
    return render_template('index.html')


@app.route('/<string:page_name>')
def html_page(page_name):
    return render_template(page_name)

поместите все HTML в ту же папку, что и ваш server.py, в папку с именем [template] и все CSS и java в папке под названием [статические] активы и все включают. не забудьте изменить пути в css, java и html

...