2016-01-31 65 views
0

你好Stackoverflow大師的!用一個Handler渲染多個Jinja模板

我是一個完整的newb,我有一個問題,我似乎無法找到答案(希望是因爲它是如此簡單,沒人打擾要問)。

我正在設計一個網站,有一堆食譜使用谷歌應用程序引擎。我希望能夠使用一個處理程序呈現一大堆配方頁面,因爲我打算以後會有很多配方,並且我不想爲每個配方創建一個新的處理程序。我的代碼如下:

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」來呈現這兩個網頁。我知道應該是可能的,但我不知道該怎麼做。

任何幫助表示讚賞!

編輯:我想我應該使用一些稱爲正則表達式的東西?但我真的不明白他們在這種情況下需要如何使用。

回答

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) 
+0

同樣,我在這裏一個完整的新手,所以我花了擺弄了幾個小時用你的代碼來弄清楚它做了什麼,但它的工作!謝謝@DanCornilescu! –