витая сеть: как правильно изображения из каталога изображений - PullRequest
3 голосов
/ 06 ноября 2010

Я успешно написал витой веб-сервер, который отображает динамически генерируемый контент.Тем не менее, когда я пытаюсь отобразить файлы изображений (png) из каталога (~ cwd / plots / image.png), на сервере происходит сбой без ошибок, и браузер отображает либо альтернативный текст, либо значок разбитого изображения.Что я делаю не так?

import sys
from twisted.internet import reactor
import twisted.python.filepath
from twisted.web import server, resource, static

FILES = ["plot/10.53.174.1.png", "plot/10.53.174.2.png", "plot/10.53.174.3.png"]

class Child(resource.Resource):

    def __init__(self,link, filename):
        resource.Resource.__init__(self)
        self.filename = filename
        self.link = link
        pass

    def render(self, request ):

        filepath = "/%s" % (self.filename)
        linkpath = "%s%s" % (self.link, filepath)

        self.getChild(linkpath, static.File(self.filename))


        return """ 
        <html><body> <head> <title>%s</title> </head> <body> <h1>%s</h1><br> <img src="%s" alt = "angry beaver" /> </body>""" % (self.link, self.link, linkpath)

class Toplevel(resource.Resource):
    #addSlash = True

    def render(self, request):


        request.write("""<html><body> <head> <title>monitor server listing</title> </head> <body> <h1>Server List</h1> <ul>""" )


        #assume a pre-validated list of  plot file names.  validate their presence anyway
        if FILES:
            for fileName in FILES:
                if os.path.exists(fileName):
                    try:

                        link =  fileName.split('.png')[0]
                        link =  link.split('plot')[1]
                        path = link[1:]

                        request.write('<li> <a href="%s">%s</a><br>' % (link, link))


                        root.putChild(path, Child(link, fileName))
                        #root.putChild(path, Child(fileName))


                    except Exception as why:
                        request.write("%s <br>" % (str(why)))
                else:
                    request.write(" you may think %s exists but it doesn't " % (fileName))

        else:
            request.write("""No files given""")

        request.write("""</ul></body></html>""")

        return ""






if __name__ == "__main__":

    root = resource.Resource()
    home = Toplevel()

    png_file = twisted.python.filepath.FilePath('./plot/')

    root.putChild('', home)

    site = server.Site(root)
    reactor.listenTCP(8007, site)
    reactor.run()

1 Ответ

1 голос
/ 06 ноября 2010
  • Первый: Просмотр источника на http://localhost:8007/10.53.174.1, Вы должны изменить код для рендеринга Правильная ссылка на изображение.
  • Второе: используйте twisted.web.static.File для показывать статический контент

Исправленный код:

import sys
import os
from twisted.internet import reactor
import twisted.python.filepath
from twisted.web.static import File
from twisted.web import server, resource, static

FILES = ["plot/10.53.174.1.png", "plot/10.53.174.2.png", "plot/10.53.174.3.png"]

class Child(resource.Resource):

    def __init__(self,link, filename):
        resource.Resource.__init__(self)
        self.filename = filename
        self.link = link
        pass

    def render(self, request ):

        filepath = "/%s" % (self.filename)
        linkpath = filepath
        #linkpath = "%s%s" % (self.link, filepath)

        self.getChild(linkpath, static.File(self.filename))


        return """ 
        <html><body> <head> <title>%s</title> </head> <body> <h1>%s</h1><br> <img src="%s" alt = "angry beaver" /> </body>""" % (self.link, self.link, linkpath)

class Toplevel(resource.Resource):
    #addSlash = True

    def render(self, request):


        request.write("""<html><body> <head> <title>monitor server listing</title> </head> <body> <h1>Server List</h1> <ul>""" )


        #assume a pre-validated list of  plot file names.  validate their presence anyway
        if FILES:
            for fileName in FILES:
        request.write(fileName)
                if os.path.exists(fileName):
                    try:

                        link =  fileName.split('.png')[0]
                        link =  link.split('plot')[1]
                        path = link[1:]

                        request.write('<li> <a href="%s">%s</a><br>' % (link, link))


                        root.putChild(path, Child(link, fileName))
                        #root.putChild(path, Child(fileName))


                    except Exception as why:
                        request.write("%s <br>" % (str(why)))
                else:
                    request.write(" you may think %s exists but it doesn't " % (fileName))

        else:
            request.write("""No files given""")

        request.write("""</ul></body></html>""")

        return ""






if __name__ == "__main__":

    root = resource.Resource()
    home = Toplevel()

    png_file = twisted.python.filepath.FilePath('./plot/')

    plot_resource = File('./plot')

    root.putChild('', home)
    root.putChild('plot', plot_resource)

    site = server.Site(root)
    reactor.listenTCP(8007, site)
    reactor.run()

PS. Ваш код немного уродлив. Вы можете улучшить это. Попробуйте прочитать это:

...