APP.YAML:组合不同的URL - 相同的文件,静态文件服务& app.yaml中的源代码访问

时间:2014-12-20 17:34:55

标签: python google-app-engine app.yaml google-app-engine-python

我现在有很多关于app.yaml的问题,我搜索和搜索了,但这个我找不到。

TLDR :请先阅读完整答案,这不是您的标准application_readable:true。 我基本上想通过不同的路线访问同一个文件,例如/static/img/pic.jpg AND /img/pic.jpg

使用案例

我构建了一个烧瓶应用程序(在fsouza的工作之后),我尝试构建一个可用于gae的烧瓶缩略图扩展(因为它是一个只读FS,我分叉flask-thumbnails目前正试图扩大它。)

所以我需要:

  • 通过python访问我的静态文件,这样我就可以快速阅读img并制作缩略图。 URL就是例如。的 /STATIC/IMG/PIC.JPG
  • 仍然通过app.yaml提供其他图片,css,js。 URL就是例如。的 /IMG/PIC.JPG

什么不起作用:

它在本地工作,部署后无效。我认为app.yaml并没有像dev_appserver.py那样严格执行。

我可以让其中一个方案起作用。这就是我的app.yaml目前的样子:

builtins:
- appstats: on
- admin_redirect: on
- deferred: on
- remote_api: on

- url: /css
  static_dir: application/static/css 

- url: /js
  static_dir: application/static/js 

- url: /img
  static_dir: application/static/img

- url: /static
  static_dir: application/static
  application_readable: true

- url: .*
  script: run.application.app

我也试过这个:

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

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

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

当我评论特定的js,css,img stuff时,应用程序可以访问application / static / img中的img并从中制作缩略图。但是例如网址/img/dont.need.thumbnail.jpg将不会被提供。

当我评论这部分时:

- url: /static
  static_dir: application/static
  application_readable: true

img,css,js就像他们应该得到的那样。

任何人都可以帮助我吗?我做错了什么?

app.yaml网址是递归的吗?

当前解决方法:

我目前的解决方法是,我只需在python应用程序中添加几个url路由。但这并不高效,我怀疑它花费了我更多的CPU时间而且速度更慢。 e.g。

app.add_url_rule('/img/<path>', 'static_img_files', view_func=views.static_img_files)
def static_img_files(path):
    return static_files("img/"+path)

奖金提示:

如果你只是git push-to-deploy

application_readable: true

将无法正常工作,因此只要您在gae服务器上测试静态图像而不在本地,python应用程序就无法访问静态图像。你必须通过应用程序引擎启动器进行部署(仅此一点花了我很长时间才发现)

2 个答案:

答案 0 :(得分:0)

您正在寻找的答案位于Static directory handlers文档的Configuring with app.yaml部分。

寻找application_readable。将该属性设置为true会给您带来最好的两个世界,但会以配额为代价(因为以这种方式标记的静态文件需要上传到两个不同的地方)。

更新了工作示例

我已将其剥离到必需品。

的app.yaml

application: example
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /dir1
  static_dir: dir1
  mime_type: text/plain

- url: /dir2
  static_dir: dir2
  mime_type: text/plain
  application_readable: true

- url: .*
  script: main.app

main.py

import webapp2

class Test(webapp2.RequestHandler):
  def get(self):
    self.response.headers['Content-Type'] = 'text/plain'
    for path in ['dir1/file1.txt', 'dir2/file2.txt']:
      try:
        with open(path) as f:
          self.response.out.write(f.read())
      except IOError:
        pass

app = webapp2.WSGIApplication([(r'/', Test)])

DIR1 / FILE1.TXT

Content1

DIR2 / FILE2.TXT

Content2

您应该可以导航到/dir1/file1.txtdir2/file2.txt并查看其内容,但导航到/只会看到后一个文件。为了简单起见,我使用了文本文件而不是图像;这个细节应该是重要的。

(我在Linux上使用GAE SDK 1.9.17)

答案 1 :(得分:0)

答案很简单:使每个访问路径都可以运行,因为负权限比正权限更强。

- url: /img
  static_dir: application/static/img
  application_readable: true           # <---- !!!!!

- url: /static
  static_dir: application/static
  application_readable: true

所以有点吃我自己的话,这是一个简单的 application_readable:true :)