【问题标题】:Python Server capable of displaying an Image on a browser能够在浏览器上显示图像的 Python 服务器
【发布时间】:2013-12-06 11:56:43
【问题描述】:

我的问题很简单也很直接。当我在浏览器上键入 localhost:9999/ok.jpg 时,我正在运行的服务器不会显示图像。我可能遗漏了一些关于服务器设置的概念。

代码如下:

import socket
import threading
import socketserver
import os

class MyHandler(socketserver.BaseRequestHandler):

def do_HEAD(self):
    self.send_response(200)
    self.send_header("Content-type", "image/jpg")
    self.end_headers()

def do_GET(self):
    self.send_response(200)
    self.send_header("Content-type", "image/jpg")
    self.end_headers() 
    f = open('ok.jpg', 'rb')
    self.wfile.write(f.read())
    f.close()


class MyServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    def __init__(self, server_adress, RequestHandlerClass):
        self.allow_reuse_address = True
        socketserver.TCPServer.__init__(self, server_adress, RequestHandlerClass, False)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = MyServer((HOST, PORT), MyHandler)
    server.server_bind()
    server.server_activate()
    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.start()

感谢您提供任何可能的帮助。

【问题讨论】:

  • 也许可以尝试添加 Content-Length 标头
  • 您的MyHandler 类不会覆盖从其基类继承的默认RequestHandler.handle() 方法(什么都不做)。
  • @martineau 你能详细说明一下吗?我正在使用 def handle(self) 并认为我需要更改为 do_HEAD 和 do_GET
  • 我的评论基于documentation 和以下示例。为了避免必须自己定义 RequestHandler.handle() 并只提供 do_xxx() 方法,您应该从类 SimpleHTTPServer.SimpleHTTPRequestHandler 派生。

标签: python image http header http-headers


【解决方案1】:

从您的 do_GET 和 do_HEAD 方法来看,您似乎真的希望 MyHandler 扩展 BaseHTTPRequestHandler http://docs.python.org/2/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler

BaseRequestHandler 不知道 HTTP(这是您的浏览器使用的)。

【讨论】:

  • 不是SimpleHTTPRequestHandler 使用do_HEAD()do_GET() 吗?我不确定我必须扩展/覆盖哪个 RequestHandler 才能使其能够显示显示图像的请求。
  • 扩展 BaseHTTPRequestHandler 并用于直接从文件系统(相对于工作目录)提供文件。 SimpleHTTPRequestHandler 实现了 do_HEADdo_GET,因此您不必这样做,如果您只想从磁盘获取文件,它实际上可能更适合您的问题。
【解决方案2】:

最好使用 SimpleHTTPServer:

import SimpleHTTPServer
import SocketServer as socketserver
import os
import threading

class MyHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    path_to_image = 'ok.jpg'
    img = open(path_to_image, 'rb')
    statinfo = os.stat(path_to_image)
    img_size = statinfo.st_size
    print(img_size)

def do_HEAD(self):
    self.send_response(200)
    self.send_header("Content-type", "image/jpg")
    self.send_header("Content-length", img_size)
    self.end_headers()

def do_GET(self):
    self.send_response(200)
    self.send_header("Content-type", "image/jpg")
    self.send_header("Content-length", img_size)
    self.end_headers() 
    f = open(path_to_image, 'rb')
    self.wfile.write(f.read())
    f.close()         

class MyServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    def __init__(self, server_adress, RequestHandlerClass):
        self.allow_reuse_address = True
        socketserver.TCPServer.__init__(self, server_adress, RequestHandlerClass, False)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = MyServer((HOST, PORT), MyHandler)
    server.server_bind()
    server.server_activate()
    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.start()

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2023-04-03
    • 2020-08-16
    • 2020-09-02
    相关资源
    最近更新 更多