我正在web.py中编写一个web应用程序(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的这一部分并将其推入主仓库可能是最好的方式。
那么,最好的方法是什么?
答案 0 :(得分:2)
在web.py中,静态资产不通过应用程序路由器提供。相反,http服务器有一个检查天气,请求URL以/static
开头。这意味着您有一个或不具有子应用程序的天气,/static/...
直接映射到根应用程序中的static
目录。
你构建一个静态类的第一个想法肯定会有效,但是你确实有一个明确的性能含义 - 但是,你必须对它进行基准测试才能真正知道它有多糟糕。
另一个选项,操作上更糟糕,但是临时修复是从父应用程序的静态目录创建软链接到子应用程序的静态目录。即。
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时将起作用。您必须在部署到的每个服务器上以及每个开发环境中设置此软链接,这会使其不太理想。