一个简单的Python webserver的do_GET()方法中的html

时间:2011-06-30 06:50:24

标签: python html webserver image

我对Python比较陌生,但是最近我用它做了很多不同的事情,我很喜欢它。但是,我遇到了以下代码遇到麻烦/阻塞。

import http.server
import socketserver
import glob
import random
class Server(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200, 'OK')
        self.send_header('Content-type', 'html')
        self.end_headers()
        self.wfile.write(bytes("<html> <head><title> Hello World </title> </head> <body>", 'UTF-8'))
        images = glob.glob('*.jpg')
        rand = random.randint(0,len(images)-1)
        imagestring = "<img src = \"" + images[rand] + "\" height = 1028 width = 786 align = \"right\"/> </body> </html>"
        self.wfile.write(bytes(imagestring, 'UTF-8'))

    def serve_forever(port):
        socketserver.TCPServer(('', port), Server).serve_forever()
if __name__ == "__main__":
    Server.serve_forever(8000)

我在这里要做的是从目录中的多个图像中抓取一个随机图像,并将其添加到对Web请求的响应中。 代码工作正常,但是当我通过浏览器访问服务器时,图像不会显示。页面的html是按照预期的。文件的权限是755.我还尝试在do_GET方法中创建index.html文件。那也行不通。我的意思是index.html生成正常,但这次浏览器中的响应没有显示任何内容(甚至标题中也没有hello world)。

我错过了这里很简单的事吗?我想我应该重载底层SocketServer.BaseServer的handle_request,因为文档说你永远不应该覆盖BaseHTTPServer的handle()方法,而应该覆盖相应的do_ *方法?

4 个答案:

答案 0 :(得分:4)

我将代码更改为:

#!usr/bin/python3.2
import http.server
import socketserver
import glob
import random
import sys

class Server(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
    referer = self.headers.get('Referer')
    print("The referer is", referer)
    if referer == None:
        self.protocol_version='HTTP/1.1'
        self.send_response(200, 'OK')
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(bytes("<html> <head><title> Hello World </title> </head> <body>", 'UTF-8'))
        images = glob.glob('*.jpg')
        rand = random.randint(0,len(images)-1)
        filepath = images[rand]
        imagestring = "<img src = \"" + images[rand] + "\" height = 1028 width = 786 align = \"right\"/> </body> </html>"
        self.wfile.write(bytes(imagestring, 'UTF-8'))
    else:
        imgname = self.path
        print ("Image requested is: ", imgname[1:])
        imgfile = open(imgname[1:], 'rb').read()
        self.send_header('Content-type', 'image/jpeg')
        self.send_header('Content-length', sys.getsizeof(imgfile))
        self.end_headers()
        self.wfile.write(imgfile)

def serve_forever(port):
    socketserver.TCPServer(('', port), Server).serve_forever()

if __name__ == "__main__":
    Server.serve_forever(8000)

使用tcpflow,我可以看到图像通过网络以二进制数据的形式发送,但我仍然看不到浏览器中的图像。

答案 1 :(得分:1)

哦,你在这一行中混合了很多"\"

"<img src = \" + images[rand] + '\" height = 1028 width = 786 align = \"right\"/> </body> </html>'

可能应该是:

'<img src = "' + images[rand] + '" height = 1028 width = 786 align="right"/> </body> </html>'

否则你不会得到图像,而是文字"images[rand]"

答案 2 :(得分:0)

我怀疑当浏览器向您的服务器发送您放入html的图像的请求时,您将向他们发送另一页的html。您可能需要在do_GET的开头添加一个检查,以确保它不是对图像的请求(或者是对某个特定页面的请求)。

答案 3 :(得分:0)

我的修改版本(作为答案发布的版本)有一些非常相似的代码,对我有用。唯一的区别是我没有发送内容长度,所以这可能是你问题的原因。