Flask学习之二 模板

继续学习flask

本部分mega教程的翻译地址:http://www.pythondoc.com/flask-mega-tutorial/templates.html

一、为什么使用模板?

以下做一个小小的扩展:输出一个大标题。

一个容易的选择就是改变我们的视图功能,输出 HTML。

修改app/views.py

 1 from app import app
 2
 3 @app.route(‘/‘)
 4 @app.route(‘/index‘)
 5 def index():
 6     user = { ‘nickname‘: ‘Miguel‘} # fake user
 7     return ‘‘‘
 8     <html>
 9       <head>
10         <title>Home Page</title>
11       </head>
12       <body>
13         <h1>hello,‘‘‘ + user[‘nickname‘] + ‘‘‘</h1>
14       </body>
15     </html>
16     ‘‘‘

网页浏览器上的显示情况:

以下是教程原话:

我们暂时还不支持用户,所以暂时使用占位符的用户对象,有时也被称为假冒或模仿的对象。这样让我们可以集中关注应用程序的某一方面,而不用花心思在暂未完成的部分上。

我希望你同意我的说法,上面的解决方案是非常难看!如果我们需要返回一个含有大量动态内容的大型以及复杂的 HTML 页面的话,代码将会有多么复杂啊!如果你需要改变你的网站布局,在一个大的应用程序,该应用程序有几十个视图,每一个直接返回HTML?这显然??不是一 个可扩展的选择。

二、初步使用模板

就是把前端和后端的分离。

文件 app/templates/index.html

1 <html>
2   <head>
3     <title>{{title}} - microblog</title>
4   </head>
5   <body>
6       <h1>Hello, {{user.nickname}}!</h1>
7   </body>
8 </html>

注意一下index.html的位置

我们只是写了一个大部分标准的HTML页面,唯一的区别是有一些动态内容的在 {{ ... }} 中。

然后在视图函数(文件 app/views.py)中使用这些模板,修改 app/views.py 内容:

 1 from app import app
 2 from flask import render_template
 3
 4 @app.route(‘/‘)
 5 @app.route(‘/index‘)
 6 def index():
 7     user = { ‘nickname‘: ‘Miguel‘} # fake user
 8     return render_template("index.html",
 9         title = ‘Home‘,
10         user = user)

为了渲染模板,我们必须从 Flask 框架中导入一个名为 render_template 的新函数。此函数需要传入模板名以及一些模板变量列表,返回一个所有变量被替换的渲染的模板。

在内部,render_template 调用了 Jinja2 模板引擎,Jinja2 模板引擎是 Flask 框架的一部分。Jinja2 会把模板参数提供的相应的值替换了 {{...}} 块。

运行后的浏览器页面可以看到是和之前一样的。

关于模板中的控制和循环语句和其他语言没什么差别,很容易理解。

三、模板继承

我们知道多数网站都有导航栏,而同一个网站的导航栏都是一样的。在每个模板中复制粘贴同样的代码是很浪费时间,而且修改起来也很麻烦(修改一个部分就要把它的拷贝全部修改)。

教程原话:我们可以利用 Jinja2 的模板继承的特点,这允许我们把所有模板公共的部分移除出页面的布局,接着把它们放在一个基础模板中,所有使用它的模板可以导入该基础模板。

定义一个基础模板,该模板包含导航栏以及上面谈论的标题(文件 app/templates/base.html):

<html>
  <head>
    {% if title %}
    <title>{{title}} - microblog</title>
    {% else %}
    <title>microblog</title>
    {% endif %}
  </head>
  <body>
    <div>Microblog: <a href="/index">Home</a></div>
    <hr>
    {% block content %}{% endblock %}
  </body>
</html>

在这个模板中,我们使用 block 控制语句来定义派生模板可以插入的地方。块被赋予唯一的名字content。

然后修改我们的 index.html 模板继承自 base.html (文件 app/templates/index.html):

{% extends "base.html" %}
{% block content %}
  <h1>Hi, {{user.nickname}}!</h1>
  {% for post in posts %}
    <div><p>{{post.author.nickname}} says: <b>{{post.body}}</b></p></div>
  {% endfor %}
{% endblock %}

这样的话,之后如果要修改导航栏只需要修改一个地方就可以了。

时间: 2024-09-30 13:04:16

Flask学习之二 模板的相关文章

Flask学习之二——模板

1.Jinja2模板引擎 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道.使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染. 默认情况下,Flask 在程序文件夹中的 templates 子文件夹中寻找模板.Flask 提供的 render_template 函数把 Jinja2 模板引擎集成到了程序中.render_template 函数的第一个参数是模板的文件名.随后的参数都是键值对,表示模板中变量对应的真实值. -*- u

Flask 学习(二)路由

Flask  路由 在说明什么是 Flask 路由之前,详细阐述下 Flask “Hello World” 这一 最小应用的代码. Flask “Hello World” 1 from flask import Flask 2 3 app = Flask(__name__) 4 5 @app.route('/') 6 def hello(): 7 return 'Hello World' 8 9 if __name__ = '__main__': 10 app.run() 剖析上述代码: 1.

flask学习(十):模板中访问模型和字典的属性

访问模型中的属性或者是字典,可以通过{{params.property}}的形式,或者是使用{{params['age']}}这样的形式 原文地址:https://www.cnblogs.com/cnhkzyy/p/9690688.html

Spring Boot学习记录(二)--thymeleaf模板

Spring Boot学习记录(二)–thymeleaf模板 标签(空格分隔): spring-boot 自从来公司后都没用过jsp当界面渲染了,因为前后端分离不是很好,反而模板引擎用的比较多,thymeleaf最大的优势后缀为html,就是只需要浏览器就可以展现页面了,还有就是thymeleaf可以很好的和spring集成.下面开始学习. 1.引入依赖 maven中直接引入 <dependency> <groupId>org.springframework.boot</gr

flask之二 模板相关

flask之二 模板相关 预热 在渲染模板的时候,默认会从项目根路径下的templates目录下查找模板 如果想要指定模板路径的时候,就在初始化APP的时候,这样操作即可: app = Flask(__name__,template_folder='C:/templates') #template_folder可以指定模板位置 模板传参 在使用render_template渲染模板的时候,可以传递关键字参数,以后直接在模板中使用就可以了 如果参数过多的话,那么就可以将所有的参数放到一个字典中,然

模板学习实践二 pointer

c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" template <typename T> class Holder { private: T* ptr; // refers to the object it holds (if any) public: // default constructor: let the

Flask学习之五 用户登录

英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins 中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/userlogin.html 开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-v-user-logins 备注:我是三个一起看的,有些

Flask学习之六 个人资料和头像

英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vi-profile-page-and-avatars 中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/profile.html 开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-vi-profile-page-

【Flask教程11】模板

基本使用 过滤器&自定义过滤器 控制代码块 宏.继承.包含 Flask 的模板中特有变量和方法 web表单 CSRF 学习目标 能够写出 jinja2 中变量代码块和控制代码块的格式 能够写出在模板中字典,列表的取值方式 能够写出数组反转的自定义过滤器(使用1种方式即可) 能够说出Flask中模板代码复用的三种方式 能够使用代码实现模板继承的功能 能够说出可以在模板中直接使用的 Flask 变量和函数 能够使用 Flask-WTF 扩展实现注册表单 能够说出 CSRF 攻击的原理 一.Jinja