Сервер Python BaseHTTPRequestHandler работает только для первого запроса GET - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь создать супер базовый веб-сервер на Python, основанный на BaseHTTPRequestHandler.Когда я впервые выполняю запрос GET по адресу 127.0.0.1/a, все работает хорошо, и я восстанавливаю изображение в своем браузере.

Однако, когда я повторяю этот запрос GET во второй раз, я ничего не получаю.Отслеживая код, я вижу, что сам код выполняется через весь сегмент do_GET (self).

Я действительно смущен тем, почему веб-сервер будет работать в первый раз, а не в следующий раз.

Любая помощь очень ценится.

from http.server import BaseHTTPRequestHandler, HTTPServer  
from os import curdir, sep


imagefile = "a.jpg"
imagepage =open(curdir+sep+imagefile, 'rb')

notfound = "File not found"

class webserverHandler(BaseHTTPRequestHandler):
    def do_OPTIONS(self):
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')                
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
        self.send_header("Access-Control-Allow-Headers", "X-Requested-With") 

    def do_GET(self):
        if self.path == "/a":
            print("getting thg jpg file")
            self.send_response(200)
            self.send_header("Content-type","image/png")
            self.end_headers()
            self.wfile.write(imagepage.read())
    else:
        self.send_error(404, notfound) 

def main():
    try:
        port = 1234
        server = HTTPServer(('127.0.0.1', port), webserverHandler)
        print("Web server is running on port {}".format(port))
        server.serve_forever()

    except KeyboardInterrupt:
        print("^C entered, stopping web server...")

    finally:
        if server:
            print("closing server")
            server.socket.close()


if __name__ == '__main__':
    main()

Спасибовы!

1 Ответ

1 голос
/ 09 мая 2019
def do_GET(self):
    notfound = "File not found"
    if self.path == "/a":
        print("getting thg jpg file")
        self.send_response(200)
        self.send_header("Content-type","image/png")
        self.end_headers()
        imagefile = "fig1.png"
        imagepage =open(curdir+sep+imagefile, 'rb')
        self.wfile.write(imagepage.read())
    else:
        self.send_error(404, notfound) 

Пожалуйста, читайте файл в каждом запросе.

Почему:
imagepage.read() делает поиск файла в конце файла изображения, поэтому мы не можем прочитать данные со следующим imagepage.read() из второго запроса.


Или
Сначала мы можем использовать imageContent = imagepage.read(),
и отправлять imageContent каждый запрос из http.server import BaseHTTPRequestHandler, HTTPServer
из os import curdir, sep

imagefile = "fig1.png"
imagepage =open(curdir+sep+imagefile, 'rb')
imageContent = imagepage.read() # Read Image here

notfound = "File not found"

class webserverHandler(BaseHTTPRequestHandler):
    def do_OPTIONS(self):
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')                
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
        self.send_header("Access-Control-Allow-Headers", "X-Requested-With") 

    def do_GET(self):
        if self.path == "/a":
            print("getting thg jpg file")
            self.send_response(200)
            self.send_header("Content-type","image/png")
            self.end_headers()
            self.wfile.write(imageContent)
        else:
            self.send_error(404, notfound) 

def main():
    try:
        port = 1234
        server = HTTPServer(('127.0.0.1', port), webserverHandler)
        print("Web server is running on port {}".format(port))
        server.serve_forever()

    except KeyboardInterrupt:
        print("^C entered, stopping web server...")

    finally:
        if server:
            print("closing server")
            server.socket.close()


if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...