我对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_ *方法?
答案 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)
我的修改版本(作为答案发布的版本)有一些非常相似的代码,对我有用。唯一的区别是我没有发送内容长度,所以这可能是你问题的原因。