HTML в методе do_GET () простого веб-сервера Python - PullRequest
0 голосов
/ 30 июня 2011

Я относительно новичок в 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)

Я пытаюсь сделать здесь случайное изображение из нескольких изображений в каталоге и добавить его в ответ на веб-запрос.,Код работает нормально, но когда я захожу на сервер через браузер, изображение не отображается.HTML-код страницы, как задумано, хотя.Права доступа к файлам - 755. Также я попытался создать файл index.html в методе do_GET.Это тоже не сработало.Я имею в виду, что index.html был сгенерирован нормально, но в ответ на этот раз в браузере ничего не показывалось (даже мир приветствия в заголовке).

Я что-то упустил здесь очень просто?Я подумал, стоит ли перегрузить handle_request базового SocketServer.BaseServer, поскольку в документации сказано, что вы никогда не должны переопределять метод handle () BaseHTTPServer, а лучше переопределить соответствующий метод do_ *?

Ответы [ 4 ]

4 голосов
/ 30 июня 2011

Я изменил код на:

#!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 голос
/ 30 июня 2011

О, вы смешиваете множество " и \" в одной строке:

"<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]"!

0 голосов
/ 14 октября 2011

У меня есть очень похожий код для вашей модифицированной версии (версия опубликована в качестве ответа), которая работает для меня.Разница лишь в том, что я не отправляю длину контента, поэтому, возможно, в этом причина вашей проблемы.

0 голосов
/ 30 июня 2011

Я подозреваю, что когда браузер отправляет вашему серверу запрос на изображение, которое вы поместили в html, вы отправляете им html для другой страницы.Возможно, вам нужно добавить проверку в начале вашего do_GET, чтобы убедиться, что это не запрос изображения (или запрос определенной страницы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...