GAE:如何上传应用程序要访问的文件?

时间:2012-09-26 20:00:41

标签: google-app-engine templates go

更新:我发现了问题。我的HTML文件静态规则仍然与模板匹配,即使它们位于子目录中。将规则更改为不再匹配后,应用程序可以访问这些文件。

我正在创建一个Google AppEngine应用程序。我正在使用Go语言,但我不确定这是否相关。我想使用带有单独模板文件的模板。因此应用程序必须读取模板文件。在本地这可以工作,但在将应用程序上传到GAE后,我在调用template.ParseFiles()时得到“没有这样的文件或目录”。

所以我想我不得不指出模板文件是应用程序文件,以便以正确的方式上传。我想也许我的模板文件被上传为静态文件,因为我的app.yaml

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

所以我将它们移动到了自己的目录中。但这并没有什么不同。我尝试在app.yaml中为我的脚本规则添加上传指令,如下所示:

- url: /.*
  script: _go_app
  upload: templates/.*

但似乎不允许这样做。那么有人能告诉我如何从我的GAE应用程序访问模板文件(或任何数据文件)吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

项目目录中的所有文件都会自动上传。

如果您的应用需要访问它们(在您使用模板时就是这种情况),则无法将它们标记为静态。这就是第一个解决方案失败的原因。

第二次尝试不起作用,因为上传不是网址描述的成员。

在您的情况下,只需部署您的应用程序,文件将自动上传并可供您的应用程序使用(您可能需要获取项目的基本路径以构建模板的完整路径)。

答案 1 :(得分:1)

文件会自动上传,假设他们不在static_dirstatic_files目录中。请参阅App Engine文档中的Skipping Files部分。 App Engine将此类目录和文件视为静态资源,并将static resources are served separately视为应用程序。

通常无法从应用程序代码访问静态资源。如果您必须将模板放在与其他静态资源相同的目录中,则可以使用application_readable设置使您的应用也可以访问这些资源。

但是正如您所注意到的,您可以将模板放在应用程序中不会映射到静态资源路径的位置;这可能是正确的做法。

答案 2 :(得分:0)

在[1]处检查app.yaml的不同选项。您可以检查static_dir和static_files选项。我正在共享一个能够下载静态文件的示例。这些文件位于静态文件夹adn test文件夹中。我分享了我的app.yaml:

runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: .*
  script: main.app

- url: /test
  static_dir: test  
  application_readable: true

- url: /(.*\.(gif|png|jpg))$
  static_files: static/\1
  upload: static/.*\.(gif|png|jpg)$
  application_readable: true

和main.py:

…
import webapp2
...
class Download(webapp2.RequestHandler):
    def get(self):

      imageName = self.request.get('img-name')
      self.response.headers['Content-Disposition'] = str('attachment; filename=' + imageName)
      f = None
      try:
          f = open('static/' + imageName, 'r')
          self.response.out.write(f.read())
      except:
          self.response.out.write('Jon Wayne')

class Test(webapp2.RequestHandler):
    def get(self):

      imageName = self.request.get('tst-name')
      self.response.headers['Content-Disposition'] = str('attachment; filename=' + imageName)
      f = None
      try:
          f = open('test/' + imageName, 'r')
          self.response.out.write(f.read())
      except:
          self.response.out.write('Jon Test')

app = webapp2.WSGIApplication([
    ('/download', Download),
    ('/tst', Test)
], debug=True)

我有两张图片:fib2.png和fib1.jpeg 然后在Test文件夹中我有两个文件fib2.tst和fib1.tst。

Web是域名。

https://web.com/download?img-name=fib2.png

https://web.com/download?img-name=fib1.jpeg

https://web.com/tst?tst-name=fib2.tst

https://web.com/tst?tst-name=fib1.tst

希望这有帮助!

[1] https://cloud.google.com/appengine/docs/standard/go/config/appref#handlers_element