更改webpy中的静态目录路径

6 投票
1 回答
3888 浏览
提问于 2025-04-16 22:59

我希望能够更改webpy的静态文件目录,而不需要在本地设置和运行nginx。目前,webpy似乎只有在/static/这个目录存在时才会创建静态目录。在我的情况下,我想用/foo/bar/作为我的静态目录,但找不到关于如何配置这个的任何信息(除了在本地运行apache或nginx)。

这只是为了本地使用,不是为了生产环境。有什么想法吗?谢谢!

1 个回答

5

如果你需要在同一个路径下使用不同的目录,你可以通过继承 web.httpserver.StaticMiddleware 来实现,或者像下面这样自己写一个中间件(这个方法是通过修改 PATH_INFO 来“欺骗” StaticApp):

import web
import os
import urllib
import posixpath

urls = ("/.*", "hello")
app = web.application(urls, globals())

class hello:
    def GET(self):
        return 'Hello, world!'


class StaticMiddleware:
    """WSGI middleware for serving static files."""
    def __init__(self, app, prefix='/static/', root_path='/foo/bar/'):
        self.app = app
        self.prefix = prefix
        self.root_path = root_path

    def __call__(self, environ, start_response):
        path = environ.get('PATH_INFO', '')
        path = self.normpath(path)

        if path.startswith(self.prefix):
            environ["PATH_INFO"] = os.path.join(self.root_path, web.lstrips(path, self.prefix))
            return web.httpserver.StaticApp(environ, start_response)
        else:
            return self.app(environ, start_response)

    def normpath(self, path):
        path2 = posixpath.normpath(urllib.unquote(path))
        if path.endswith("/"):
            path2 += "/"
        return path2


if __name__ == "__main__":
    wsgifunc = app.wsgifunc()
    wsgifunc = StaticMiddleware(wsgifunc)
    wsgifunc = web.httpserver.LogMiddleware(wsgifunc)
    server = web.httpserver.WSGIServer(("0.0.0.0", 8080), wsgifunc)
    print "http://%s:%d/" % ("0.0.0.0", 8080)
    try:
        server.start()
    except KeyboardInterrupt:
        server.stop()

另外,你也可以创建一个名为 "static" 的符号链接,并把它指向另一个目录。

撰写回答