谷歌App Engine的静态页面的Python 2.5目录等(Google App Engine

2019-10-31 14:03发布

我在这个新的,我打算我的东西从付费的网络服务移动到GAE(没有动只是静态网页)。 相信我,我已经花了无数的时间努力使这项工作,但我陷入了僵局,从而实现我一个结果,在别人的排斥,反之亦然。

我相信这是一个简单的答案,而且我违反了一些基本原则。 我想的是,应用程序引擎页面(mygaeid.appspot.com)提供了一个静态目标,使得其他页面都可以通过添加后缀如mygaeid.appspot.com/oranges.html mygaeid.appspot.com/grapes等的.html

我无法做到这一点,这样我要么我能得到其他页面,当我添加后缀如mygaeid.appspot.com/apples.html; mygaeid.appspot.com/oranges.html而不是着陆页或用稍微不同的YAML着陆页(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)我已经连同其他HTML页面如oranges.html等放置apples.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的实际投放量我想要的结果,但很守规矩,因为所有文件都在根目录下塞满。

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和感谢戴夫我回去再次仔细阅读日志Wooble的解决方案作品,但我需要把htmdir(包含HTML),一个称为静态目录内。 GAE是静态网站一个伟大的(而且免费)的解决方案

您的帮助和反馈是非常赞赏

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

Answer 1:

If you declare files as static in app.yaml, they are not available to your application's handlers.

However, if they're really static, using the django template engine to "render" them is kind of silly; just add mappings in app.yaml to display the static files, including one to display 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

(no python files needed)



Answer 2:

Woobie有正确的答案。 让我词组不同的看法。

当你把html的static_files ,他们正在通过专用于提供静态内容的单独服务提供。 您的应用程序将无法看到这些文件。 该应用程序只能看到是资源文件。

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

下一个步骤,以获得解决你的问题(如果你还没有这样做已位于)是更新您的文章,以显示您当前app.yaml ,同时也向我们展示了在应用程序的日志什么东西被报道了。



Answer 3:

还有,为什么是这样工作的技术原因

在一个非常简单的顶>底部程序方式的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请求,并从远程位置获取文件。 显然,获取远程文件,而不是本地的文件将会增加加载时间和等待时间。



文章来源: Google App Engine static pages Python 2.5 directories etc