【问题标题】:How to use a template html in different folder on Google App Engine python?如何在 Google App Engine python 的不同文件夹中使用模板 html?
【发布时间】:2015-11-24 03:59:37
【问题描述】:

我正在尝试在 python 的不同文件夹中使用模板化的 html 文件,但我遇到了找不到文件的错误。例如,

index_path = os.path.join (os.path.join(os.path.dirname( __file__ ), '..', 'html'), 'index.html')

index.html 位于 html 文件夹中。我的 python 处理程序代码在 handlers 文件夹中。

.
├── app.yaml
├── handlers
├── html

项目结构在 Google App Engine 中部署后的样子?

注意:我正在使用:

from google.appengine.ext.webapp import template
template.render(index_path, {})

我根据以下建议修改了代码,仍然没有运气:

handlers/index.py:

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname('html')))

index_file = 'index.html'
template = jinja_environment.get_template(index_file)
content = template.render({})

self.response.out.write(content)

html/index.html:

来自 app.yaml:

libraries:
- name: jinja2
  version: latest

【问题讨论】:

  • print(index_path) 给你什么?
  • 类似于 ~/handlers/../html/portal.html
  • 您使用的是什么模板系统?在 GAE 自带的模板框架 Jinja2 中,通常不会构建完整的文件路径,而是准备一个 loader。你在 index_path 上做了什么操作来得到“文件未找到错误”?
  • 我正在使用 webapp 的默认模板:from google.appengine.ext.webapp import template template.render(index_path, template_values)
  • ~/handlers/../html/portal.html 之类的内容对于已部署的应用程序无效,因为该应用程序不会超出用户的主目录。

标签: python google-app-engine templates


【解决方案1】:

在 GAE 中渲染模板的首选方式是使用 Jinja2。 Jinja2 使用loaders

加载器负责从资源加载模板,例如 文件系统

您需要修改 app.yaml 以便您的应用程序可以访问 Jinja2。

libraries:
- name: jinja2
  version: latest

然后准备一个模板环境和一个加载器来帮助从您的html 文件夹中获取模板

import jinja2

env = jinja2.Environment(loader=jinja2.FileSystemLoader('html'))

template = env.get_template('index.html')
...
template.render(template_values)

编辑:

通过添加__init__.py 使处理程序文件夹成为一个包。具有如下目录结构:

.
├── app.yaml
├── handlers
│   ├── hello.py
│   └── __init__.py
└── html
    └── index.html 

然后在app.yamlhandlers 部分中应该执行类似于以下操作:

handlers:
- url: /.*
  script: handlers.hello.app # with app defined in hello.py
...
libraries:
- name: jinja2
  version: latest

【讨论】:

  • 感谢您的回答。它不起作用。 html 文件夹比我的 .py 所在的 handlers 文件夹高一级。
  • app.yaml 中的处理程序部分的内容是什么,尤其是运行应用程序以呈现模板的脚本?
  • @ssk 不是所有的信息,但无论如何我已经更新了答案,以显示我所说的app.yamlhandlers 部分的意思。
  • ...不要使用os.path.dirname,只使用'html'
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2014-01-24
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多