2

我正在 web.py (重写/扩展mongs)中编写一个网络应用程序,我希望它既可以用作独立应用程序,也可以用作可以将请求转发到的子应用程序。我遇到的问题是,当它用作子应用程序时,不能轻易地从它自己的静态目录中提供静态文件。由于我打算分发它(并且不要求用户将文件组合到他们项目的静态目录中),我希望目录结构为:

app_that_is_using_mongs (not mine)
    static (which holds the app's static files - also not mine)
    mongs (my subapp)
        main.py (the code for mongs)
        view (holds templates)
        static (the static folder for mongs)
    main.py (the code for the app that is using mongs)

...以便整个 mongs 目录与使用它的任何应用程序分开。

我考虑了一些使它起作用的可能性:

  • 使用从静态目录读取和输出文件的请求处理程序,例如:

    cwd = os.path.dirname(__file__) + '/'  # get current working directory
    
    class Static:
        def GET(self, filename):
            """searches for and returns a requested static file or 404s out"""
            try:
                return open(cwd + 'static/' + filename, 'r').read()
            except:
                web.application.notfound(app)  # file not found
    

我不确定这个解决方案对于大文件的性能,看起来这应该是 web.py 可以自己做的事情。

  • 通过 web.py 访问cherry.py staticdir 工具添加另一个静态目录...我不知道如何做这样的事情(直接与运行 web.py 的服务器交互),我不知道认为如果我切换到 Gunicorn 服务器(或除了cherry.py 之外的任何服务器)它仍然可以工作。

  • 修复 web.py 处理静态文件的方式以使其更具可扩展性......如果没有其他方法,那么重写 web.py 的这一部分并将其推送到主 repo 可能是最好的方法。

那么,最好的方法是什么?

4

1 回答 1

2

在 web.py 中,静态资产不通过应用程序路由器提供服务。相反,http 服务器有一个检查天气,请求 url 以/static. 这意味着无论您是否有子应用程序,都/static/...直接映射到static根应用程序中的目录。

您构建静态类的第一个想法肯定会奏效,但您是对的,它对性能有一定的影响——不过,您必须对其进行基准测试才能真正了解它有多糟糕。

另一个选项,操作上更糟糕,但临时修复是创建从父应用程序的静态目录到子应用程序的静态目录的软链接。IE

parent_app/
    static/
        sub_app/ -> parent_app/sub_app/static/sub_app
        ...
    sub_app/
        static/
            sub_app/
                ...

然后,当您想从 访问静态资产时sub_app,您会点击如下网址:/static/sub_app/asset。由于此 url 以 开头/static,它将被 http 服务器捕获并重定向到static目录,跟随软链接,并解析为实际资产。由于sub_app目录的原因,直接运行 sub_app 或运行 parent_app 时,此解决方案将起作用。您必须在部署到的每台服务器上以及为每个开发环境设置此软链接,这使得这不太理想。

于 2012-11-10T03:12:51.253 回答