我想做一个运行在GAE框架/服务上的简单网站。它非常小,而且我不需要整个强大的Django框架,因此我选择使用谷歌制作的Webapp2框架,再加上Jinja2模板语言。
我来自一个非常赤裸裸的面向PHP和HTML的背景,所以我很难适应一个真正的框架的工作方式。我目前最大的疑问来自模板系统和请求处理程序是如何协同工作的,尤其是如果页面的模板有几个“动态”元素的话。
我将首先解释我过去在PHP中所做的事情,这样您就可以更好地理解我想要实现的目标。
假设我想要一个网站:
因此,我在PHP中所做的工作被压缩成一个简单的例子,index.php。
<?php
/*here use the $_GET or $_POST variable, and the $_SESSION variable
to figure out who's connected, which page is being displayed,
and store those values in global variables, for the
included modules to use */
include('page_header.php'); // renders the whole <head> </head> tag and its content
echo "<body>";
include('views/menu.php'); //generates the menu, displays it
switch($page_name){
case "home":
include('home.php'); //renders the page body for the homepage
break;
case "articles":
include('home.php'); //renders the page body for the blog articles listing
break;
case "guestbook":
include('home.php'); //renders the page body for the guestbook
break;
}
echo "</body>";每个包含模块,使用调用它们的脚本(index.php)中的变量,以及$_POST、$_GET、$_SESSIOn超级全局,确定要显示什么,并将其呈现给HMTL。在这里,index.php还使用开关语句做了一些非常基本的路由。
现在,回到webapp2和jinja2框架
我知道,要使用Jinja构建web页面,需要使用块结构,并对这些块进行extend。因此,为了构建与前面的PHP示例类似的页面,我创建了以下模板base.html
<html>
<head>
<link rel="stylesheet" href="/static/css/reset.css">
{% block title %}
{% endblock title %}
</head>
<body>
<div class="menu">
{% block menu %}
{% endblock menu %}
</div>
<div class="body">
{% block content %}
{% endblock content %}
</div>
</body>
</html>我不明白的是,您将如何构建不同的处理程序,从而生成Jinja将用于呈现块的上下文,以及避免冗余的。**此外,我可以使用几个单独只扩展一个块的不同模板文件(例如: menu.html、header.html、body_home.html、body_articles.html、.)**
你可以用它作为回答的基础,教会了我所有我需要知道的。
谢谢你的帮助,很抱歉有语法错误,英语不是我的母语。
发布于 2014-07-28 03:17:41
jinja2中有一个名为宏的特性,它几乎是一个参数化的包含。
因此,如果应该将包含参数化,您可以这样做:
{% macro menu(params) -%}
do something
{%- endmacro %}并调用模板中的宏:
<div> menu('bar') </dib>如果不需要提供参数,只需将其保留为父模板中的静态html。
对于处理程序,您可以遵循App引擎 hello示例,只需使用链接指导您加载jinja的环境。
我知道您希望翻译php示例,但是尝试在处理程序中执行尽可能多的逻辑,而不是模板。
对于你的第二个问题,是的,如果你想要的话,你可以只扩展一个块,如果你需要父母的内容,就有一个{{super()}}块来获取它们。
https://stackoverflow.com/questions/24985142
复制相似问题