【问题标题】:GAE: How to upload files to be accessed by the application?GAE:如何上传应用程序要访问的文件?
【发布时间】:2012-09-18 12:50:39
【问题描述】:

更新:我发现了问题。我的 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 应用程序中访问模板文件(或任何数据文件)?

谢谢!

【问题讨论】:

  • 您介意根据您的发现添加您自己的问题答案吗?

标签: google-app-engine templates go


【解决方案1】:

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

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

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

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

【讨论】:

  • 你是说我不能像这样使用相对路径? (如何编写多行 cmets?) tpl, err = template.ParseFiles("templates/errors.html")
  • 谢谢,我不知道文件会自动可用。这让我意识到它们仍然被视为静态的。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    在 [1] 中检查 app.yaml 的不同选项。您可以检查 static_dir 和 static_files 选项。我正在分享一个能够下载静态文件的示例。这些文件位于静态文件夹和测试文件夹中。我分享我的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      相关资源
      最近更新 更多