【问题标题】:Render Multiple Jinja Templates with One Handler使用一个处理程序渲染多个 Jinja 模板
【发布时间】:2016-05-09 01:28:44
【问题描述】:

您好 Stackoverflow 大师!

我是一个完全的新手,我有一个问题,我似乎找不到答案(希望因为它是如此简单,没有人会费心去问)。

我正在使用谷歌应用引擎设计一个包含大量食谱的网站。我希望能够使用一个处理程序来呈现一堆食谱页面,因为我计划以后有很多食谱并且我不想为每个食谱制作一个新的处理程序。我的代码如下:

import urllib2
import webapp2
import jinja2
import os


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

class Handler(webapp2.RequestHandler):
def write(self, *a, **kw):
    self.response.out.write(*a, **kw)

def render_str(self,template,**params):
    t = JINJA_ENVIRONMENT.get_template(template)
    return t.render(params)

def render(self,template,**kw):
    self.write(self.render_str(template,**kw))

class MainHandler(Handler):
def get(self):
    template = JINJA_ENVIRONMENT.get_template('main.html')
    self.response.write(template.render())

class RecipeHandler(Handler, recipe):
def get(self, recipe):
    recipe_pages = {
    'carbonara' : 'carbonara.html'
    'burger' : 'burger.html'
    }
    if recipe in recipe_pages:
        template = JINJA_ENVIRONMENT.get_template(recipe_pages[recipe])
        self.response.write(template.render())
    else:
        self.abort(404)



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

我基本上想避免写出“CarbonaraHander”和“BurgerHandler”,而只使用“RecipeHandler”来呈现这两个页面。我知道这应该是可能的,但我不知道该怎么做。

感谢任何帮助!

编辑:我想我应该使用一种叫做正则表达式的东西?但我真的不明白在这种情况下需要如何使用它们。

【问题讨论】:

    标签: python html google-app-engine jinja2


    【解决方案1】:

    AFAIK 你不能将参数传递给处理程序,你需要从请求中提取它们。这就是我要做的(进一步推动它直接在 URl 路由中使用模板名称):

    class RecipeHandler(Handler):
    
        def extract_template_name_from_request(self):
    
            return self.request.path_info[9:] # strip leading '/recipes/' (or whatever else you need)
    
        def get(self):
    
            template_name = self.extract_template_name_from_request()
            try:
                template = JINJA_ENVIRONMENT.get_template(template_name)
            except Exception:
                # can't locate a template matching the requested path
                self.abort(404)
                return
    
            # prepare the template values as needed
            values = {'recipe': {'name': template_name[:-5]}}  # just an example
    
            try:
                self.response.write(template.render(values))
            except Exception:
                # failure rendering the template
                self.abort(500)
    
    app = webapp2.WSGIApplication([
        ('/recipes/.*.html', RecipeHandler), # see extract_template_name_from_request()
        ('/.*', MainHandler),
    ], debug=True)
    

    【讨论】:

    • 再说一次,我是一个完全的新手,所以我花了几个小时摆弄你的代码来弄清楚它做了什么,但它确实有效!谢谢@DanCornilescu!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    相关资源
    最近更新 更多