Как передать изображение в браузер через http python socket
Пишу простой сервер на python, используя библиотеку встроенную socket. Разобрался с отправкой html, css, но не могу отправить изображение. Везде во всех примерах, что я видел, делают просто 2 сокета для клиента и сервера и в них пускают бесконечный цикл, который качает картинку. Но мне это не подходит, ведь я хочу получить изображение на своей html-странице в браузере. Какое есть решение?
функция, которая достаёт изображение, читает и возвращает
def get_image():
with open('image.jpg', 'rb') as img:
return img.read()
Сам код сокета
import socket
from views import get_home_page, get_about_page, get_image
from static_route import get_static
URLS = {
'/': get_home_page,
'/about/': get_about_page,
'/image.jpg': get_image # здесь я получаю ссылку на функцию,
# которая вернёт мне мою картинку в виде байт-строки
}
def parse_request(request):
parsed = request.decode('utf-8').split(' ')
method, url = parsed[:2]
return method, url
def generate_headers(method, url):
if method != 'GET':
return ('HTTP/1.1 405 Method not allowed\n\n', 405)
if url not in URLS:
return ('HTTP/1.1 404 Page not found\n\n', 404)
return ('HTTP/1.1 200 Content-Type: text/html OK\n\n', 200)
def generate_content(code, url):
if code == 404:
return '<h1>404</h1><p>Page not found</p>'
if code == 405:
return '<h1>405</h1><p>Method not allowed</p>'
return URLS[url]()
def generate_response(request):
method, url = parse_request(request)
if 'static' in url:
return get_static(method=method, url=url).encode()
# Здесь обрабатываю запрос картинки
if 'image' in url:
img_binary = URLS[url]()
return b'HTTP/1.1 200 Content-Type: image/jpeg\n\n OK\n\n' + b'Content-Length: ' + str(len(img_binary)).encode() + img_binary
headers, code = generate_headers(method, url)
body = generate_content(code, url)
return (headers + body).encode()
# AF_INET - IPv4 protocol, SOCK_STREAM - TCP protocol
def run():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('127.0.0.1', 9000))
server_socket.listen()
while True:
client_socket, address = server_socket.accept()
request = client_socket.recv(1024)
response = generate_response(request)
client_socket.send(response)
client_socket.close()
if __name__ == '__main__':
run()
Вот ответ от браузера, вроде ошибок нет, если перейти по адресу http://127.0.0.1:9000/image.jpg, то скачается картинка, но открыть её не получается, или часть данных не передается или ещё что-то, не знаю, что делать.