Python Google应用程序引擎静态文件服务与应用程序冲突
我有一个单页应用程序(SPA),我正在运行谷歌应用程序引擎(GAE)。GAE做三件事:Python Google应用程序引擎静态文件服务与应用程序冲突,python,google-app-engine,Python,Google App Engine,我有一个单页应用程序(SPA),我正在运行谷歌应用程序引擎(GAE)。GAE做三件事: 提供index.html文件 提供静态文件(JS、CSS等) 通过REST提供动态文件(图像、文本等) 我使用以下app.yaml配置 handlers: - url: /app static_dir: app - url: /.* script: main.app 我的理解是,这应该匹配到/app文件夹的任何请求,该文件夹将为我的静态文件提供服务。所有REST服务和主索引页都将被/*捕获并由ma
handlers:
- url: /app
static_dir: app
- url: /.*
script: main.app
我的理解是,这应该匹配到/app文件夹的任何请求,该文件夹将为我的静态文件提供服务。所有REST服务和主索引页都将被/*捕获并由main.py处理
但是,我看到以下行为:
path = os.path.join(os.path.dirname(__file__), 'app')
jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(path))
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/html'
template_values = {}
template = jinja_environment.get_template('index.html')
self.response.out.write(template.render(template_values))
我的目录结构如下:
/
- main.py
- 应用程序yaml等
- 应用程序
- index.html
- app.js
- 模块A
- moduleA.tpl.html
- moduleA.js
path = os.path.dirname(__file__)
jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(path))
(非常有趣的是)index.html到Jinja模板和静态目录文件的“双重映射”似乎导致了一个问题。我想知道这样做的最佳实践方式是什么。我使用Jinja有一个原因:将(GAE生成的)登录/注销链接添加到index.html文件。除此之外,没有理由使用它。好的,这可能解释了场景2,如何访问index.html?如果您将/app添加到处理程序中,并且您的请求url类似于/app/index.html,那么它将从静态目录提供服务 在您的场景中,您的url似乎不包含/app,因此它将转到main.app的第二个处理程序规则
但是,由于您将html放在/app中,appengine将其视为静态文件。如果要从jinja模板提供文件,则不应将其放在static_dir好的,这可能解释了场景2,如何访问index.html?如果您将/app添加到处理程序中,并且您的请求url类似于/app/index.html,那么它将从静态目录提供服务 在您的场景中,您的url似乎不包含/app,因此它将转到main.app的第二个处理程序规则
但是,由于您将html放在/app中,appengine将其视为静态文件。如果您希望从jinja模板提供文件,则不应将其放入静态目录中。默认情况下,Python无法访问在App Engine中标记为静态的文件或目录。您可以将
应用程序\u readable:true
添加到处理程序映射以启用此功能
另一个解决方案是将index.html
从静态文件夹中移出,因为它实际上不是静态文件,而是Python的jinja模板
- 相关问题:
默认情况下,Python无法访问应用程序引擎中标记为静态的文件或目录。您可以将
应用程序\u readable:true
添加到处理程序映射以启用此功能
另一个解决方案是将index.html
从静态文件夹中移出,因为它实际上不是静态文件,而是Python的jinja模板
- 相关问题:
通常的做法是将它们放在/templates目录中。app.yaml中没有对该目录的引用,它仅在内部用于提供模板。查看github中的一些样板应用程序(搜索“gae样板”)。这一个是最小的,使用了Jinja,因此可能是一个很好的示例您将index.html放在哪里?似乎是您将index.html放在了导致问题的/app中。@mar