繁体   English   中英

Google App Engine静态文件服务与应用程序冲突

[英]Google App Engine static file serving conflicts with application

我有一个单页应用程序(SPA),我正在使用Google App Engine(GAE)。 GAE做三件事:

  1. 服务index.html文件
  2. 服务静态文件(JS,CSS等)
  3. 通过REST服务动态文件(图像,文本等)

我使用以下app.yaml配置。

handlers:
- url: /app
  static_dir: app

- url: /.*
  script: main.app

我的理解是,这应该匹配到/ app文件夹的所有请求,该请求将为我的静态文件提供服务。 然后,所有的REST服务和主索引页面将被/.*捕获并由main.py处理

但是,我看到以下行为:

  1. 如果删除/ app处理程序,则可以成功提供index.html(通过Jinja模板)和REST服务(例如localhost / subjects /)。 但是 ,我看不到静态文件(按预期)。
  2. 如果添加/ app处理程序,则index.html文件将提供服务,并给出“内部服务器错误” IOError(errno.EACCES,“文件不可访问”,文件名)。 但是 ,当我请求诸如“ localhost / app / app.js”之类的静态文件时,此操作成功。

我在这里缺少什么吗? 我不明白为什么两者会发生冲突。

谢谢!

注意: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM