jinja2链接到静态文件

时间:2017-02-06 09:57:40

标签: python css google-app-engine jinja2

我试图了解如何在jinja2中创建指向静态文件的链接。

我查找的所有内容都与Flask有关,而我现阶段只使用webapp2。

我的main.py文件如下所示:

import os
import urllib

from google.appengine.api import users
from google.appengine.ext import ndb

import jinja2
import webapp2

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'],
    autoescape=True)

class MainPage(webapp2.RequestHandler):
    def get(self): 
    template = JINJA_ENVIRONMENT.get_template('/templates/base.html')  
    self.response.out.write(template.render())

class ConsultsPage(webapp2.RequestHandler):
    def get(self):
    template = JINJA_ENVIRONMENT.get_template('/templates/consults.html')  
    self.response.out.write(template.render())

class CreateConsultPage(webapp2.RequestHandler):
    def get(self):
    template = JINJA_ENVIRONMENT.get_template('/templates/create-consult.html')  
    self.response.out.write(template.render())

app = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/consults', ConsultsPage),
    ('/schedule/create-consult', CreateConsultPage)
], debug=True)

我的base.html模板包含指向" / css"," / js"中静态文件的链接" /图像"等

当我查看localhost时:8080 /和localhost:8080 /咨询所有静态文件是否正常工作。页面看起来很好。

然而,localhost:8080 / consults / create-consult结构中的下一个级别没有链接到静态文件。

当我查看源代码时,我看到css链接已呈现为localhost:8080 / consults / css / style.css,当实际位置为localhost时:8080 / css / style.css。

我知道我可能需要通过一些名为uri_for的环境变量使所有链接动态化,但我找不到实现它的正确方法。

我尝试用

替换我的css链接
href="{{ uri_for('static', filename='css/screen.css') }}"

App Engine uri_for告诉我没有设置。

基本上想知道设置uri_for的正确过程,然后知道如何将它合并到我的静态文件链接的路径中。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:2)

uri_for() Flask特定的函数;它将名称static与路由匹配,然后可以使用该路径生成路径(如果/static/css/screen.css路由配置为处理static网址,则为/static/<path:filename>

您只需将路径硬编码为/css/screen.css,无需功能。

注意领先的/;这使它成为相对于当前主机的绝对路径。对于http://localhost:8080/foo/bar的网页,此类路径的前缀为http://localhost:8080,以形成http://localhost:8080/css/screen.css。部署到应用程序引擎时,主机名将不同。

可以在全局中存储前缀网址或路径,因此您可以在以后轻松换出CDN的路径:

JINJA_ENVIRONMENT.globals['STATIC_PREFIX'] = '/'

并在模板中使用它:

<style src="{{ STATIC_PREFIX }}css/screen.css"></style>

现在,您可以将STATIC_PREFIX设置为其他值,包括http://somecdn.cdnprovider.tld/prefix/,从而在一个地方更改所有此类网址。