GAE / Python / jinja2 / 如何在join语句中引用子目录

Posted

技术标签:

【中文标题】GAE / Python / jinja2 / 如何在join语句中引用子目录【英文标题】:GAE / Python / jinja2 / How to reference a subdirectory in join statement 【发布时间】:2012-08-20 12:07:44 【问题描述】:

我的根目录的子目录“static”中有一个 html 文件“listagem.html”。 我想使用“listagem.html”作为 jinja2 的模板。

我尝试了这 3 个连接公式:

第一:

jinja_environment = jinja2.Environment(
    autoescape = True, 
    loader =  jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'static')))

第二:

jinja_environment = jinja2.Environment(
    autoescape = True, 
    loader =  jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'static/')))

第三:

jinja_environment = jinja2.Environment(
    loader = jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), '/static')))
        template = jinja_environment.get_template('listagem.html')
        self.response.out.write(template.render(template_values)) 

并收到此错误:

file not accessible: 'C:\\Users\\Me\\AppEngine\\MyAppRoot\\static\\listagem.html'

我做错了什么?

坦克寻求帮助。

【问题讨论】:

【参考方案1】:

您可能在app.yaml 文件中添加了static_dir url 处理程序,并将static 目录(您的模板所在的位置)设置为static_dir

这会使您的文件无法访问,因为static files are not available in the application's file system。

app.yaml文件中删除static_dir,并在您的项目文件夹中添加一个静态模板文件夹。

创建一个jinja环境如下:

jinja_environment = jinja2.Environment(autoescape=True,
    loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'static')))

【讨论】:

如果它有效,您可以接受答案,以帮助看到问题的其他人 只是用一些看起来很明显的东西来扩展它,但如果一个文件与skip_files 正则表达式匹配,你也会得到IOError。所以,不能是静态的,路径也不能跳过。【参考方案2】:

你有一个错误。 1. 在你的 appengine 配置文件中,你需要同样的代码:

application: yourapp
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico
- url: /js
  static_dir: static/js
- url: /css
  static_dir: static/css
- url: /img
  static_dir: static/img  
- url: .*
  script: main.app

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

看那个“- url items”...这是你的静态内容(js css img) 对于您的 html 模板,您需要根应用程序的子文件夹模板,在我的情况下是 myapp/template 并在里面放置您的模板(模板内容,html)

您的主应用程序看起来像这样。 main.py

import os
import webapp2
import jinja2

jinja_environment = jinja2.Environment(autoescape=True,
    loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates')))

class MainHandler(webapp2.RequestHandler):
    def get(self):
        template_values = 
            'name': 'nombre',
            'verb': 'programando'
        

        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(template_values))    

app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

【讨论】:

以上是关于GAE / Python / jinja2 / 如何在join语句中引用子目录的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jinja2 在 GAE 中存储 Javascript 对象

Jinja2 中的 if 语句

Python / Django / Jinja2:如何用另一个变量的值扩展变量名(例如在 for 循环中)?

Flask 和 Webapp2 (GAE) 的区别

有没有人通过在 GAE/App Engine 中使用更快的模板引擎获得实际收益?

使用 Jinja2 的 HTML 模板 - 丢失