如何使用CherryPy作为静态文件的Web服务器?

21

有没有简单的方法可以使用CherryPy作为Web服务器,以显示某个文件夹中的.html文件?所有CherryPy的介绍文档都指出内容是动态生成的:


import cherrypy
class HelloWorld(object):
    def index(self):
        return "Hello World!"
    index.exposed = True
cherrypy.quickstart(HelloWorld())

有没有更简便的方法可以使用index.html而不是HelloWorld.index()方法?

4个回答

36

这段简单的代码将会在当前目录下提供文件。

import os
import cherrypy

PATH = os.path.abspath(os.path.dirname(__file__))
class Root(object): pass

cherrypy.tree.mount(Root(), '/', config={
        '/': {
                'tools.staticdir.on': True,
                'tools.staticdir.dir': PATH,
                'tools.staticdir.index': 'index.html',
            },
    })

cherrypy.quickstart()

10
在使用CherryPy 3.2时,我需要将cherrypy.quickstart()更改为cherrypy.engine.start()cherrypy.engine.block(),才能够提供内容。 - technomalogical
同样,在CherryPy 3.6中,您必须使用cherrypy.engine.start()cherrypy.engine.block() - Nathan Romano

6
以下是关于使用CherryPy提供静态内容的信息:http://docs.cherrypy.org/stable/progguide/files/static.html 顺便说一下,这里有一个使用Python在HTTP上共享当前目录的简单方法:
# Python 3 $ python -m http.server [port]
# Python 2 $ python -m SimpleHTTPServer [port]

我知道SimpleHTTPServer,但使用cherrypy做同样的事情非常有趣。不幸的是,教程没有提到如何将任何.html文件作为静态内容提供 - 只有预定义的.css文件 :( - grigoryvp
您提供的文件类型并不重要,它应该能够与HTML文件一起使用。请参见http://www.cherrypy.org/wiki/StaticContent#Servingfilesthroughthestaticdirtool。另一个链接:http://www.nabble.com/How-do-I-serve-up-static-file-pages--td20897705.html。 - codeape
1
Wiki链接已更改为http://docs.cherrypy.org/stable/progguide/files/static.html。 - Cees Timmerman
如果你想要做的与codeape最初发布的cmdline类似,那么维基链接没有任何帮助。也就是说,运行一个简单的服务器,从一个定义的目录(或cwd)提供静态内容,而无需编写任何代码,无论多么琐碎。 - chb

0
# encode: utf-8

import cherrypy
WEB_ROOT = "c:\\webserver\\root\\"

class CServer( object ) :
    @cherrypy.expose
    def do_contact(self, **params):
        pass

cherrypy.server.socket_port = 80
# INADDR_ANY: listen on all interfaces
cherrypy.server.socket_host = '0.0.0.0'
conf = { '/':
  { 'tools.staticdir.on' : True,
    'tools.staticdir.dir' : WEB_ROOT,
    'tools.staticdir.index' : 'index.html' } }
cherrypy.quickstart( CServer(), config = conf )

如果你有一个名为do_contact的文件?那么这个文件将无法下载吗? - nosklo
那是一个例子,看起来我被误导了,并认为“do_contract”是某种内部过滤器方法来覆盖 :) - grigoryvp

0
我发布这个新答案是因为已接受答案的解决方案已经过时了。 这段简单的代码将在当前目录中提供文件。
import os
import cherrypy

PATH = os.path.abspath(os.path.dirname(__file__))
class Root(object): pass

cherrypy.tree.mount(Root(), '/', config={
        '/': {
                'tools.staticdir.on': True,
                'tools.staticdir.dir': PATH,
                'tools.staticdir.index': 'index.html',
            },
    })

cherrypy.engine.start()
cherrypy.engine.block()

当然,这只是已经发布的内容的概述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接