我现在有很多关于app.yaml的问题,我搜索和搜索了,但这个我找不到。
TLDR :请先阅读完整答案,这不是您的标准application_readable:true。 我基本上想通过不同的路线访问同一个文件,例如/static/img/pic.jpg AND /img/pic.jpg
我构建了一个烧瓶应用程序(在fsouza的工作之后),我尝试构建一个可用于gae的烧瓶缩略图扩展(因为它是一个只读FS,我分叉flask-thumbnails目前正试图扩大它。)
它在本地工作,部署后无效。我认为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应用程序就无法访问静态图像。你必须通过应用程序引擎启动器进行部署(仅此一点花了我很长时间才发现)
答案 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.txt
和dir2/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 :)