我试图了解如何在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的正确过程,然后知道如何将它合并到我的静态文件链接的路径中。
任何帮助表示感谢。
答案 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/
,从而在一个地方更改所有此类网址。