Google App Engine静态页面Python 2.5目录等

时间:2012-01-04 21:07:26

标签: python google-app-engine static yaml directory

我是新手,我打算将我的东西从付费网络服务转移到GAE(没有任何动态的静态页面)。相信我,我花了无数个小时试图完成这项工作,但我陷入了僵局,我在排除另一个结果时获得了一个结果,反之亦然。

我确信这是一个简单的答案,我违反了一些基本原则。我想要的是应用引擎页面(mygaeid.appspot.com)提供静态登陆页面,以便其他页面可用,并添加后缀,例如mygaeid.appspot.com/oranges.html mygaeid.appspot.com/grapes.html等。

我无法实现这一点,以至于当我添加后缀时,我或者能够获取其他页面,例如mygaeid.appspot.com/apples.html; mygaeid.appspot.com/oranges.html但不是登陆页面或者登陆页面(mygaeid.appspot.com)略有不同,但是无法访问其他页面(mygaeid.appspot.com/oranges.html)等)有后缀。

py文件(abcdefg.py)位于下方,对于后面两个不同的yamls是通用的:

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template

class MainHandler(webapp.RequestHandler):
  def get (self, q):
    if q is None:
      q = 'htmdir/apples.html'

    path = os.path.join (os.path.dirname (__file__), q)
    self.response.headers ['Content-Type'] = 'text/html'
    self.response.out.write (template.render (path, {}))


def main ():
  application = webapp.WSGIApplication ([('/(.*html)?', MainHandler)], debug=True)
  util.run_wsgi_app (application)

if __name__ == '__main__':
  main ()

使用以下yaml,着陆页(mygaeid.appspot.com)完美运行(提供apples.html的内容),但如果我添加后缀,则无法访问该页面。 mygaeid.appspot.com/apples.html或mygaeid.appspot.com/static/htmdir/apples.html等,一旦我添加后缀,它就不起作用。在目录(htmdir)中,我将apples.html与其他html页面一起放置,例如oranges.html等,我无法使用此yaml访问其中任何一个。

application: mygaeid
version: 1
runtime: python
api_version: 1

handlers:
- url: /(.*\.(html))
  static_files: static/htmdir/\1
  upload: static/htmdir/(.*\.(html))

- url: /css
  static_dir: css

- url: /js
  static_dir: js

- url: /images
  static_dir: images

- url: .*
  script: abcdefg.py

如果我按如下方式修改yaml,则登陆页面(mygaeid.appspot.com)不起作用,但是当我添加后缀时,它会完美地工作,例如mygaeid.appspot.com/apples.html; mygaeid.appspot.com/oranges.html等提供了相应的页面:

- url: /(.*\.(html))
  static_files: htmdir/\1
  upload: htmdir/(.*\.(html))

最后,如果我完全放弃目录并使用相同的abcdefg.py(没有目录),下面非常简单的yaml实际上提供了我想要的结果但是非常不守规矩,因为所有文件都填充在根目录中。 / p>

application: mygaeid
version: 1
runtime: python
api_version: 1

handlers:
- url: /(.*\.(png|js|css))
  static_files: \1
  upload: (.*\.(png|js|css))

- url: .*
  script: abcedfg.py

任何帮助都会非常感激。 感谢


感谢wooble并感谢dave我再次回去并仔细阅读日志Wooble的解决方案有效,但我需要将htmdir(包含html)放在名为static的目录中。 GAE是静态网站的优秀(免费)解决方案

非常感谢您的帮助和反馈

SiteDirectory
-mygaeid
  -static
    -htmdir
  -js
  -css
  -images
 app.yaml
 index.yaml
(py file was removed)

3 个答案:

答案 0 :(得分:4)

如果您在app.yaml中将文件声明为静态,则应用程序的处理程序无法使用它们。

然而,如果它们真的是静态的,使用django模板引擎来“渲染”它们是有点傻;只需在app.yaml中添加映射即可显示静态文件,包括一个显示apples.html for /:

application: mygaeid
version: 1
runtime: python
api_version: 1

handlers:
- url: /(.*\.html)
  static_files: static/htmdir/\1
  upload: static/htmdir/.*\.html

- url: /css
  static_dir: css

- url: /js
  static_dir: js

- url: /images
  static_dir: images

- url: /
  static_files: static/htmdir/apples.html
  upload: static/htmdir/apples\.html

(不需要python文件)

答案 1 :(得分:1)

Woobie有正确的答案。让我用不同的方式说出来。

当您将.html放在static_files中时,它们由专用于提供静态内容的单独服务提供服务。您的应用将无法看到这些文件。该应用只能看到资源文件。

Django模板必须是资源,而不是静态文件。否则,应用程序无法看到它们,template.render(path, ...将失败。

解决问题的下一步是(如果你还没有这样做)是更新你的帖子以显示你当前的app.yaml,并向我们展示应用程序日志中报告的内容

答案 2 :(得分:0)

技术上存在这种原因

app.yaml配置以一种非常简单的顶级>底层程序方式运行。

匹配按以下顺序进行:

1. - url: /(.*\.(html))
  static_files: static/htmdir/\1
  upload: static/htmdir/(.*\.(html))

2. - url: /css
  static_dir: css

3. - url: /js
  static_dir: js

4. - url: /images
  static_dir: images

5. - url: .*
  script: abcdefg.py

简单地说,如果文件的后缀为.html,则会在步骤1中匹配,并将该请求从mygaeid.appspot.com/.html重新路由到mygaeid.appspot.com/htmdir/的.html。步骤5中的* .html处理程序永远不会被命中,因为已经说出了所有* .html路由。

此外 - 正如答案已经涵盖的那样 - 标记为静态的目录将无法在本地提供给您的应用处理程序。我将尝试解决原因的技术原因。

app.yaml充当GAE反向代理的配置文件。静态文件仅在上载时更改,因此它们非常适合缓存。通过在部署时立即将静态文件推送到缓存服务器,GAE可以提高加载性能并从应用服务器中消除不必要的负载。

有充分的理由认为静态请求是单独计算的,而且成本低于常规应用请求。每次请求静态文件时,您实际上都是从GAE的CDN中提取文件。如果你只是获取静态文件,那么你的服务器就没有理由在第一时间进行调整。

这种方法的明显缺点是这些文件与您的应用程序在同一台服务器上并不存在,因此您无法直接在应用程序中获取或上传它们。

注意:还要遵循其他答案。不要将模板文件夹标记为静态。当您的应用程序加载模板时 - 而不是从相邻目录中获取模板 - 它必须发送Web请求并从远程位置获取文件。显然,获取远程文件而不是本地文件会增加加载时间和延迟。