python - 从 web.py 中的子应用程序提供静态文件

标签 python cherrypy web.py static-files subapplication

我正在 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 的这一部分,也许将其推送到主存储库中可能是最好的办法。

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

最佳答案

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

您构建静态类的第一个想法肯定会起作用,但您是对的,这对性能有一定的影响 - 不过,您必须对其进行基准测试才能真正知道它有多糟糕。

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

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

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

关于python - 从 web.py 中的子应用程序提供静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888904/

相关文章:

python - 如何使用 python 在 JSON 输出上显示所有字符串匹配

python - 替换 block 大小小于阈值的重复项 - Python

python - Cherrypy:多处理

python - web.py 可以处理多少个请求?

python - Webpy属性错误 ' header key'

python - 如何在交互式 Python 中显示字符串格式规范帮助

python - exe 文件无法正常工作(没有任何反应)

python - CherryPy:创建在 apache2 后面运行的 Web 服务 (mod_wsgi)

javascript - 将 db url 作为 ajax 参数传递