Hello Stackoverflow Guru,你好!
我是一个完整的新手,我有一个问题,我似乎无法找到答案(希望因为它是如此简单,没有人费心去问)。
我正在设计一个网站,其中包含一些使用谷歌应用引擎的食谱。我希望能够使用一个处理程序渲染一堆配方页面,因为我计划稍后有很多配方,我不想为每个配方创建一个新的处理程序。我的代码如下:
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”来渲染这两个页面。我知道应该是可能的,但我不知道该怎么做。
感谢任何帮助!
编辑:我想我应该使用一些叫做正则表达式的东西?但我真的不明白在这种情况下如何使用它们。
答案 0 :(得分:1)
AFAIK您无法将args传递给处理程序,您需要从请求中提取它们。这就是我要做的事情(推动它进一步直接使用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)