如何更改 web.py 中的默认文件夹 "static"

How to change the default folder "static" in web.py

我的项目中的一个库需要一个包含 CSS 文件的文件夹,这些文件位于应用程序根目录中,名为 "themes"。 web.py 默认情况下,使用文件夹 "static" 到 return 静态文件并重命名她...不是我在网上找到的解决方案之一如下

在网址中需要添加行

'/(?:img|js|css)/.*',  'app.controllers.public.public',

app.controllers.public

需要下一个代码

class public:
    def GET(self): 
        public_dir = 'themes'
        try:
            file_name = web.ctx.path.split('/')[-1]
            web.header('Content-type', mime_type(file_name))
            return open(public_dir + web.ctx.path, 'rb').read()
        except IOError:
            raise web.notfound()

def mime_type(filename):
    return mimetypes.guess_type(filename)[0] or 'application/octet-stream' 

但是这个解决方案不起作用,文件仍然是从静态中提取的...

有没有简单明了的解决方法?也许我们应该更改 web.py?

中文件夹的名称

没有简单的方法可以更改 web.py 对 /static/ 的使用,但是有一种非常简单的方法可以添加您自己的使用,而无需在您的列表中添加任何内容urls.

看看web.py的代码,你会发现web.httpserver.StaticMiddleware就是定义this的地方。你的工作是创建另一个带有新前缀的 WSGI 中间件。然后,因为这是 WSGI 中间件,将新的 class 添加到 运行 链。

from web.httpserver import StaticMiddleware

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run(lambda app: StaticMiddleware(app, '/themes/')

如果这对你来说太简洁了,请考虑它与显式创建一个新的子class并将该子class传递给app.run()相同:

from web.httpserver import StaticMiddleware

class MyStaticMiddleware(StaticMiddleware):
    def __init__(self, app, prefix='/themes/'):
        StaticMiddleware.__init__(self, app, prefix)

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run(MyStaticMiddleware)

请注意,“/static/”仍然有效,从 /static/ 子目录加载文件:您所做的只是添加了 另一个 处理器,它做同样的事情, 但来自 '/themes/' 子目录。