Flask教程今天已经进入到第五讲了,我都是从最基础的点入手讲的,相信你也都学的不错吧

今天我们学习的重点有二:模板上下文和模板继承

模板上下文

上节我们了解到,Jinja2中提供了许多的控制结构,作用是为了改变模板的渲染流程。

{%        %}是Jinja2中的控制语句,
{{     }}是Jinja2中的变量,
{#       #}是注释。

通常情况下,在渲染模板时调用template_render()函数向模板传入变量,除此之外还可可以使用set、with定义变量

set语句:

在模版中,可以使用set语句来定义变量。示例如下:

{% set username='捡猫课堂' %}<p>用户名:{{ username }}</p>

一旦定义了这个变量,那么在后面的代码中,都可以使用这个变量,就类似于Python的定义的全局变量是一样的。

with语句:

with语句定义的变量,只能在with语句块中使用,超过了这个代码块,就不能再使用了。示例代码如下:

{% with classroom = '捡猫班' %}<p>班级:{{ classroom }}</p>{% endwith %}

with语句也不一定要跟一个变量,可以定义一个空的with语句,以后在with块中通过set定义的变量,就只能在这个with块中使用了,

类似于Python中的局部变量

{% with %}{% set classroom = '捡猫班' %}<p>班级:{{ classroom }}</p>{% endwith %}

常见的模板内置全局变量

config 当前配置对象
request 当前请求对象
session 当前会话对象
g 与请求绑定的全局变量

使用内置全局变量session判断用户是否登录

如果用户登陆则显示用户名,否则提示'请先登录!'

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户登录</title>
</head>
<body>
{% if session['log_in'] %}欢迎{{session['username']}}登录
{% else %}请先登录!
{% endif %}</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户登录</title>
</head>
<body>
<form action="" method="post"><div><label for="username">用户名</label><input type="text" id="username" name="username" value=""></div><div><label for="password">密&nbsp;&nbsp;&nbsp;码</label><input type="password" id="password" name="password" value=""></div><button type="submit">提交</button>
</form></body>
</html>

run.py

from flask import Flask,request,render_template,make_response,session,redirect,url_forapp = Flask(__name__)
app.secret_key = '11'@app.route('/')
def index():return render_template('index.html')@app.route('/login', methods=['GET','POST'])
def login():# 验证表单数据if request.method == 'POST':username = request.form['username']password = request.form['password']if username == 'admin' and password == 'a123':session['username'] = username  # 将用户名写入Sessionsession['log_in'] = True     # 登录标识写入Sessionreturn redirect(url_for('index'))return render_template('login.html') # 渲染表单页面@app.route('/logout')
def logout():session.clear() # 清除Sessionreturn redirect(url_for('login'))if __name__ == '__main__':app.run(debug=True,port=8000)

浏览器中运行127.0.0.1.8000,未登录时,显示图1

登录之后,显示图3

模板继承

模板继承类似于Python中的类的继承,Jinja2允许定义一个基模板(父模板).

把网页上的导航栏、页脚等放在基模板中。

每一个继承基模板的子模板在被渲染时都会自动包含这些部分。

使用这种方法的好处就是避免在多个模板中代码重用

在Jinja2中,使用关键字extends实现子模板对父模板的继承

导航栏:_nav.html

<style>footer {position: absolute;bottom: 0;width: 100%;height: 60px;line-height: 60px;background-color: #f5f5f5;}.text-muted {color: #6c757d!important;text-align: center;}
</style>
<footer><div class="text-muted">德玛西亚有限公司Copyright ©2007-2020, demaxiya.com, All Rights Reserved</div>
</footer>

页脚: _footer.html

<style>footer {position: absolute;bottom: 0;width: 100%;height: 60px;line-height: 60px;background-color: #f5f5f5;}.text-muted {color: #6c757d!important;text-align: center;}
</style>
<footer><div class="text-muted">德玛西亚有限公司Copyright ©2007-2020, demaxiya.com, All Rights Reserved</div>
</footer>

使用include引入 '_nav.html'导航栏和'_footer.html' 底部信息栏

父模板:base.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="stylesheet" href="/static/css/bootstrap.css"><script src="/static/js/jquery.js"></script><script src="/static/js/bootstrap.js"></script>
</head>
<body>
{% include '_nav.html' %}
{% block  content %}{% endblock %}
{% include '_footer.html' %}
</body>
</html>

首页index.html

{% extends 'base.html' %}
{% block content %}
<main role="main"><div class="jumbotron"><div class="container"><h1 class="display-3">欢迎来到德玛西亚首页!</h1><p>德玛西亚是一个法理至上的强大王国,战功赫赫,久负盛名。德玛西亚人自古崇尚正义、荣耀和责任,近乎狂热地以自身的传统及底蕴为豪。然而,尽管秉持着这些高尚的原则,在过去的几百年间,刚愎自用的德玛西亚越发与世隔绝,成为了孤立主义的代名词。
然而现在,王国中已经出现了变数。
德玛西亚雄都以禁魔石——一种可以抑制魔法能量的白色岩石——为基,起初是符文战争之后为了躲避魔法侵害的人们所建立的庇护地。王权由中心向外辐射,守护着边远的城镇、农田、森林和矿产丰饶的山脉。
然而,自从嘉文三世国王突然驾崩,各大家族至今仍未赞同他唯一的继承人嘉文王子继位。
在王国眼中,重兵把守的边境之外已经是异心遍起,许多原先的附庸在乱世来临之际开始寻求来自别处的庇护。有人私下妄言,德玛西亚的黄金时代已经一去不返,除非臣民能够上下一心,顺应时代的变化——许多人认为他们并没有这样的能力,否则王国的衰败在所难免。
再多的禁魔石,也无法阻止德玛西亚由内而外的覆灭</p><p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more »</a></p></div></div>
</main>
{% endblock %}

books.html

{% extends 'base.html' %}
{% block content %}
<main role="main"><div class="jumbotron"><div class="container"><h1 class="display-3">欢迎来到艾欧尼亚!</h1><p>在凶险海域环绕中,诸多同盟省份在一片被称为“初生之土”的庞大群岛上组成了艾欧尼亚。追寻万物的平衡是这里长久以来的文化基调,因此物质与精神领域之间的界限也在这里若有若无,在野外的森林和山脉中尤为如此。虽然这片土地上的魔力可能变幻无常,栖息着的生物也可能危险而神奇,但在过去的几百年中,艾欧尼亚的居民一直过着富足的生活。习武的僧院、各省的民兵团、甚至就连艾欧尼亚这片土地本身,都已经足够保护当地的居民。但那一切都在十二年前结束了,因为那一年,诺克萨斯出兵攻打了“初生之土”。一望无际的帝国大军在艾欧尼亚肆虐,艾欧尼亚人经过多年的苦战才以巨大的代价击败敌人。如今的艾欧尼亚正处于脆弱的和平中。对于那场战争的不同应对,让这片土地产生了分裂——有一些团体,例如朔极的武僧和均衡教派,想要回归与世隔绝的和平以及田园牧歌的传统。另一些比较激进的派系,例如纳沃利兄弟会和影流,则主张对这片土地的魔法进行军事化改造,建立一个统一的国家,强大到足以对诺克萨斯实施打击报复。艾欧尼亚的命运正悬在微妙的平衡中,几乎无人愿意使其倒向任何一边,但所有人都能感到脚下的土地在蠢动不安</p><p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more »</a></p></div></div>
</main>
{% endblock %}

contact.html

{% extends 'base.html' %}
{% block content %}
<main role="main"><!-- Main jumbotron for a primary marketing message or call to action --><div class="jumbotron"><div class="container"><h1 class="display-3">联系我们!</h1><p>商务合作及对外项目合作(媒体公关合作、内容合作、品牌合作及课程团购业务):<br>电子邮件:demaxiya@.com <br>联系电话:0431-84978981 <br></p><p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more »</a></p></div></div><!-- /container --></main>
{% endblock %}

浏览器访问http://127.0.0.1:8000/如下:

浏览器访问http://127.0.0.1:8000/books如下:

浏览器访问http://127.0.0.1:8000/contact 如下:

flask模板上下文和模板继承相关推荐

  1. Flask框架四:模板继承以及豆瓣案例

    1.模板继承 ①为什么会有模板继承而不用include调用模板:include是引用模板的标签,将模板的内容直接显示,但是当页面有变化的时候,比如多了一个侧边栏的内容,或者想改输入框为按钮,这时候就要 ...

  2. Flask入门之Jinjia模板的一些语法

    原文:https://www.cnblogs.com/wongbingming/p/6807771.html Flask入门之Jinjia模板的一些语法 1. 变量表示 {{ argv }} 2. 赋 ...

  3. Web后端学习笔记Flask(2)模板

    模板渲染: 在flask中,视图函数可以直接通过render_template进行模板渲染.在flask中,模板文件是存放在template文件夹中:在调用模板文件的时候,模板文件的路径从templa ...

  4. Flask框架基础Jinja2模板

    Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 文章目录 Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 return 模板 Template 模板的使用 ...

  5. flask中的html模板及调用

    1.html模板 <html><head><title>{{title}} - microblog</title></head><bo ...

  6. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  7. html语言可以写模版继承吗,Django框架(十一):模板介绍、模板语言、模板继承、HTML转义...

    1. 模板介绍 1.1 模板的功能 产生html,控制页面上展示的内容.模板文件不仅仅是一个html文件. 模板文件包含两部分内容: 静态内容:css.js.html. 动态内容:用于动态去产生一些页 ...

  8. laravel 模板继承_Laravel框架模板之公共模板、继承、包含实现方法分析

    本文主要介绍了laravel框架模板之公共模板.继承.包含实现方法,结合实例形式分析了Laravel框架中公共模板的建立.模板包含.模板继承等相关操作技巧,需要的朋友可以参考下,具体如下: 简介: 利 ...

  9. 子模板继承父模板示例_模板设计模式示例

    子模板继承父模板示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重 ...

最新文章

  1. linux下各种Raid介绍
  2. Leaf:GO语言游戏框架介绍及入门
  3. android动态监听事件,Android-常见的事件监听
  4. 转:PHP 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
  5. 【Linux】一步一步学Linux——dpkg-statoverride命令(277)
  6. ubuntu15.10下code::blocks设置运行窗口为gnome命令行
  7. java里的时间转换
  8. DDD:四色原型、DDD、DCI之间的关系
  9. VC++实现全局钩子勾住消息对话框
  10. 关于王者荣耀防沉迷以及各种实名认证
  11. 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)...
  12. 软件加密狗破解思路和防破解的博弈之路
  13. uniapp scroll-view组件横向滚动不生效
  14. 前端javascript总结笔记(一)--js的三座大山
  15. EF Core 批量写入数据使用整理_EF Core批量插入数据(一)
  16. python试卷管理系统的设计与实现_在线考试系统的设计与实现毕业设计论文.doc...
  17. CSS漂亮盒子(下)
  18. 根据当前时间计算年龄的函数
  19. Python新手的数据批量处理教程(TXT文件)
  20. 【路径规划】样条曲线

热门文章

  1. 大消息:虚拟现实已经可以让你互换性别了!
  2. vce题库制作/刷题软件/
  3. java对接图灵机器人搭建自己的智能机器人
  4. 三种IP核总线接口比较分析
  5. “笨办法”学Python3,Zed A. Shaw, 习题1~2
  6. 每天学命令list_property
  7. python量化投资实战-股票实盘分析
  8. (root) Additional property nginx is not allowed
  9. 免费空间/硬盘/相册的集合。。。
  10. Uigg - 免费开源、灵活的高颜值前端 UI 工具套件,专为设计师打造