[英]Google App Engine static file serving conflicts with application
我有一个单页应用程序(SPA),我正在使用Google App Engine(GAE)。 GAE做三件事:
我使用以下app.yaml配置。
handlers:
- url: /app
static_dir: app
- url: /.*
script: main.app
我的理解是,这应该匹配到/ app文件夹的所有请求,该请求将为我的静态文件提供服务。 然后,所有的REST服务和主索引页面将被/.*捕获并由main.py处理
但是,我看到以下行为:
我在这里缺少什么吗? 我不明白为什么两者会发生冲突。
谢谢!
注意:Google App Engine 1.8.9,Python 2.7,本地开发
编辑:
这是我用来提供页面的Python代码
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
app.yaml等
应用
的index.html
app.js
模块A
moduleA.tpl.html
moduleA.js
编辑2:
我将index.html移到根目录(/),然后使用以下python代码:
path = os.path.dirname(__file__)
jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(path))
(非常有趣)似乎是index.html到Jinja模板以及静态目录文件的“双重映射”引起了问题。 我想知道什么是最佳做法。 我使用Jinja的原因是:将(GAE生成的)登录/注销链接添加到index.html文件。 除此之外,没有理由使用它。
默认情况下,Python无法访问App Engine中标记为静态的文件或目录。 您可以在处理程序映射中添加application_readable: true
以启用此功能。
另一个解决方案是将index.html
从静态文件夹中移开,因为它实际上不是静态文件,而是Python的Jinja模板。
application_readable
可选的。 默认情况下,在静态文件处理程序中声明的文件将作为静态数据上传,并且仅提供给最终用户,应用程序无法读取它们。 如果此字段设置为true,则文件也将作为代码数据上传,因此您的应用程序可以读取它们。 两次上载均按您的代码和静态数据存储资源配额收费。
好的,它可以解释方案#2,如何访问index.html? 如果将/ app添加到处理程序中,并且您的请求网址类似于/app/index.html,则它将从静态目录中提供。
在您的情况下,您的网址似乎不包含/ app,因此转到第二个处理程序规则,该规则将进入main.app。
但是,由于您将html放在/ app内,因此appengine将其视为静态文件。 如果要通过jinja模板提供文件,则不应将其放在static_dir中
Jinja模板(或Django,Mako等)无需位于公共可访问的文件夹中。 它们始终通过应用程序中的处理程序进行调用,并在服务给用户之前在应用程序中进行编译。
通常将它们放在/ templates目录中。 app.yaml中没有对该目录的引用,它仅在内部用于提供模板。 在github中查看一些样板应用程序(搜索“ gae样板”)。 这是最小的并且使用Jinja,所以可能是您的一个很好的例子https://github.com/SoulAuctioneer/notvanillae
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.