我正在尝试理解如何在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”、"/images“等静态文件的链接。
当我查看localhost:8080/和localhost:8080/consults时,所有的静态文件都在工作。佩奇看起来很好。
但是,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的正确过程,然后如何将其合并到我的链接到静态文件的路径。
感谢您的帮助。
发布于 2017-02-06 18:57:03
uri_for()是一个特定于Flask的函数;它将名称static与路由相匹配,然后可以使用该路由生成路径(如果static路由配置为处理/static/<path:filename> urls,则类似于/static/css/screen.css )。
你只需要将路径硬编码为/css/screen.css,不需要函数。
请注意前导的/;,这使它成为相对于当前主机的绝对路径。对于http://localhost:8080/foo/bar上的页面,这样的路径会加上前缀http://localhost:8080以形成http://localhost:8080/css/screen.css。当您部署到应用程序引擎时,主机名将不同。
您可以将前缀URL或路径存储在全局中,以便以后可以轻松地将路径替换为CDN:
JINJA_ENVIRONMENT.globals['STATIC_PREFIX'] = '/'并在您的模板中使用它:
<style src="{{ STATIC_PREFIX }}css/screen.css"></style>现在,您可以通过将STATIC_PREFIX设置为不同的值(包括http://somecdn.cdnprovider.tld/prefix/ ),在一个位置更改所有此类URL。
https://stackoverflow.com/questions/42064874
复制相似问题