首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当JInja模板有多个块时,如何构建请求处理程序?

当JInja模板有多个块时,如何构建请求处理程序?
EN

Stack Overflow用户
提问于 2014-07-27 20:06:49
回答 1查看 555关注 0票数 0

我想做一个运行在GAE框架/服务上的简单网站。它非常小,而且我不需要整个强大的Django框架,因此我选择使用谷歌制作的Webapp2框架,再加上Jinja2模板语言。

我来自一个非常赤裸裸的面向PHP和HTML的背景,所以我很难适应一个真正的框架的工作方式。我目前最大的疑问来自模板系统和请求处理程序是如何协同工作的,尤其是如果页面的模板有几个“动态”元素的话。

我将首先解释我过去在PHP中所做的事情,这样您就可以更好地理解我想要实现的目标。

假设我想要一个网站:

  • 取决于所访问的页面的页面标题,例如:"Mysite.com \\控制面板“
  • 动态菜单栏,它可能根据用户的配置文件或登录状态而更改。
  • 显然,一个完全依赖于正在查看的页面的页面主体。

因此,我在PHP中所做的工作被压缩成一个简单的例子,index.php

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
<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、.)**

你可以用它作为回答的基础,教会了我所有我需要知道的

谢谢你的帮助,很抱歉有语法错误,英语不是我的母语。

EN

回答 1

Stack Overflow用户

发布于 2014-07-28 03:17:41

jinja2中有一个名为的特性,它几乎是一个参数化的包含。

因此,如果应该将包含参数化,您可以这样做:

代码语言:javascript
运行
复制
{% macro menu(params) -%}
   do something
{%- endmacro %}

并调用模板中的宏:

代码语言:javascript
运行
复制
<div> menu('bar') </dib>

如果不需要提供参数,只需将其保留为父模板中的静态html。

对于处理程序,您可以遵循App引擎 hello示例,只需使用链接指导您加载jinja的环境。

我知道您希望翻译php示例,但是尝试在处理程序中执行尽可能多的逻辑,而不是模板。

对于你的第二个问题,是的,如果你想要的话,你可以只扩展一个块,如果你需要父母的内容,就有一个{{super()}}块来获取它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24985142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档