更新:我发现了问题。我的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应用程序访问模板文件(或任何数据文件)吗?
谢谢!
答案 0 :(得分:1)
项目目录中的所有文件都会自动上传。
如果您的应用需要访问它们(在您使用模板时就是这种情况),则无法将它们标记为静态。这就是第一个解决方案失败的原因。
第二次尝试不起作用,因为上传不是网址描述的成员。
在您的情况下,只需部署您的应用程序,文件将自动上传并可供您的应用程序使用(您可能需要获取项目的基本路径以构建模板的完整路径)。
答案 1 :(得分:1)
文件会自动上传,假设他们不在static_dir
或static_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