flask web学习之模板(二)

文章目录

      • 一、模板结构组织
        • 1.1 局部模板
        • 1.2 宏
        • 1.3 模板继承
      • 二、模板进阶
        • 2.1 空白控制
        • 2.2 加载静态文件
        • 2.3 消息闪现
        • 2.4 自定义错误页面
        • 2.5 在js和css中使用Jinja2

一、模板结构组织

1.1 局部模板

当多个独立模板中都会使用同一块HTML代码时,我们可以把这部分代码抽离出来,存储到局部模板中。这样,既可以避免重复,也可以方便统一管理。

{% include '_banner.html' %}  # 为了和普通模板分开,局部模板的命名通常都以一个下划线开始
1.2 宏

宏是Jinja2提供的一个非常有用的特性,它类似Python的函数。使用宏可以把一部分代码封装到宏里,通过传递的参数来构建内容,最后渲染。

_macros.html
# 在创建宏时,使用macro与endmaccro标签来声明宏。
{ % macro qux(amount) = 1 %}{% if amount == 1 %}I am a boy.{% elif amount >1 %}I am a girl.{% endif %}
{%% endmacro %}

使用时,像Python中导入函数一样导入。

{% from '_macros.html' import qux %}
....
{{qux(amount=5)}}

另外在使用宏的时候要注意上下文问题。出于性能的考虑,并且为了让这一切保持显式,默认情况下include一个模板时会传递上下文到局部模板中,但import不会。所以我们需要导入时显式的使用with context来声明传入当前模板的上下文。

1.3 模板继承

Jinja2允许你定义一个基本模板,把网页上的导航栏、页脚等通用内容放在基模板中,而每一个继承模板的子模板都会在渲染时自动包含这些部分。
基模板 base.html

<!DOCTYPE html>
<html>
<head>{% block head %}<meta charset="utf-8"><title>{% block title %} 基模板 {% endblock %}</title>{% block style %}{% endblock %}{% endblock %}
</head>
<body><header><!-- 网站头部内容 --></header><nav><!-- 网站导航栏内容 --></nav><main><!-- 网站主要内容 -->{% block content %}{% endblock %}</main><footer><!-- 网站页脚内容 -->{% block footer %}...{% endblock %}</footer>{% block scripts %}{% endblock %}
</body>
</html>

基本模板中块的开始和技术分别使用block和endblock标签俩声明,并且块与块之间可以嵌套。我们只需要在子模板中定义同名的快来执行继承操作。
子模板 index.html

{% extends 'base.html' %}
{from 'macros.html' import qux %}{% block content %}
{% set name = 'baz' %}
<h1>sdad</h1>
<li>macro:{{ qux{amount=5) )} </li>
{% endblock %}

在子模块中,可以对父模块中的块执行两种操作:

  • 覆盖内容:创建同名模块即可。
  • 追加内容:需要使用super()函数进行声明。
# 追加内容至base.html 的styles模块
{% block styles %}
{{ super() }}
<style>.foo{color: #FFF;}
</style>
{% endblock %}

二、模板进阶

2.1 空白控制
  • 如果想在渲染时去掉模板中的空行,可以在定界符内添加减号。
<div>
{% if True -%}<p>Hello!</p>
{%- endif %}
  • 还有一种办法是使用模板环境对象提供的trin_blocks和lstrip_blocks属性设置,欠着删除Jinja2语句的第一个空行,后者删除Jinja2语句所在行之前的空格和tabs
app.jinja_env.trin_blocks = True
app.jinja_enc.lstrip_blocks = True

需要注意的是宏内的空白控制行为只能用第一种办法设置。

2.2 加载静态文件
  • 添加Favicon
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}" >
  • 使用css框架
{% block styles %}<link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}" >
{% endblock %}{% block scripts %}<script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
{% endblock %}
  • 使用宏加载静态资源
<--定义宏-->
{% macro static_file(type, url, loacl=True) %}{% if local %}{% set url=url_for('static', filename=url) %}{% endif %}{% if type == 'css' %}<link rel="stylesheet" href="{{ url }}">{% elif type == 'js' %}<script src="{{ url }}"></script>{% endif %}
{% endmacro %}<--使用宏-->
{% import "static.macros.html" as static %}{{ static.static_file("css", "/static/css/style.css") }}
{{ static.static_file("js", "/static/js/script.js") }}
2.3 消息闪现

flask提供了一个非常有用的flash()函数,它可以用来闪现需要显示给用户的消息。

# 使用flash“闪现”消息
@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 == 'password':flash('登录成功!', 'success')return redirect(url_for('index'))else:flash('用户名或密码错误!', 'error')return render_template('login.html')# 模板渲染flash消息
{% with messages = get_flashed_messages() %}{% if messages %}<ul class="messages">{% for message in messages %}<li class="{{ message[1] }}">{{ message[0] }}</li>{% endfor %}</ul>{% endif %}
{% endwith %}
2.4 自定义错误页面

flask提供了@app.errorhandler()装饰器来自定义错误页面。它接收三个参数,code:状态码,name:原因短语,description:错误描述。

@app.errorhandler(404)
def page_not_found(e):return render_template('error/404.html'), 404
2.5 在js和css中使用Jinja2
  1. 嵌入/行内式js/css
    难以维护,跳过。
  2. 定义为js/css变量
// script.js
var name = '{{ name }}';
console.log('Hello ' + name + '!');/* style.css */
:root {--background-color: {{ bg_color }};--color: {{ text_color }};
}#foo {color: var(--color);background-color: var(--background-color);
}

当然还有很多其他办法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客刷题:BC45 小乐乐改数字(中等)

自我介绍&#xff1a;一个脑子不好的大一学生&#xff0c;c语言接触还没到半年&#xff0c;若涉及到效率等问题&#xff0c;各位都可以在评论区提出见解&#xff0c;谢谢啦。 该账号介绍&#xff1a;此帐号会发布游戏&#xff08;目前还只会简单小游戏&#xff09;&#xff0c…

如何在 NestJS 中使用 TypeORM 实现多数据库连接配置

前言 当你打算在一个 NestJS 应用中操作多个数据库时&#xff0c;TypeORM 提供了优雅而强大的解决方案。在本教程中&#xff0c;我们将一步步了解如何在 NestJS 项目中配置 TypeORM 以使用多个数据库。 实现步骤 一、创建 NestJS 项目 如果你还没有一个 NestJS 项目&#x…

P9 视频码率及其码率控制方式

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

《微信小程序开发从入门到实战》学习七十五

6.8 文件API 6.8.4 删除文件API 使用wx.removeSavedFile可删除小程序中保存的本地文件。示例代码如下&#xff1a; // 获取文件列表 wx.getSavedFileList({ success(res) { if (res.fileList.length > 0) { // 删除第一个文件 wx.removeSavedFile({ filePath: res.fileLis…

react中使用 react-draggable 问题总结

react-draggable 是在使用 React 时经常用到的拖拽库&#xff0c;不过在使用时&#xff0c;下面是一些常见的问题&#xff0c;做此记录 1、在移动端中使用 react-draggable 进行拖拽操作时,在拖拽内部onClick事件是失效的 解决方案&#xff1a;使用onTouchStart来替换onClick事…

外包做了1个月,技术退步一大半了。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

Doris 在工商信息商业查询平台的湖仓一体建设实践(02)

信息服务行业可以提供多样化、便捷、高效、安全的信息化服务,为个人及商业决策提供了重要支撑与参考。本文以某工商信息商业查询平台为例,介绍其从传统 Lambda 架构到基于 Doris Multi-Catalog 的湖仓一体架构演进历程。同时通过一系列实践,展示了如何保证数据的准确性和实时…

Java课程设计个人博客

目录 引言&#xff1a;在此说明在本次课设过程中所遇到的困难&#xff01; 一、项目搭建的问题 Q1:Web项目应用啥么编译器编写&#xff1f; Q2:如何创建Web项目(MAVEN)&#xff1f; Q3:Tomcat服务器开头控制台显示乱码如何解决&#xff1f; Q4:Tomcat服务器怎么设置项目的…

2024最新腾讯云CVM服务器和轻量应用服务器有什么区别?

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;腾讯云服务器网txyfwq.com活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元…

过滤器和拦截器

上篇文章我们学习了 Session 认证和 Token 认证&#xff0c;这篇我们来学习一下过滤器和拦截器&#xff0c;过滤器和拦截器在日常项目中经常会用到。 一、过滤器 1.1、理论概念 过滤器 Filter 是 JavaWeb 三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一&am…

Mac 环境多JDK安装与切换

一、下载jdk 去Oracle官网上下载想要安装的jdk版本&#xff0c;M芯片选择arm架构的.bmg格式的文件。 https://www.oracle.com/java/technologies/downloads/。 二、安装jdk 2.1 双击下载的文件&#xff0c;安装步骤一步步点继续就好。 2.2 安装完成后会在/Library/Java/JavaV…

【Linux Shell】9. 流程控制

文章目录 【 1. if else 判断 】1.1 if1.2 if else1.3 if elif else1.4 实例 【 2. case 匹配 】【 3. 循环 】3.1 for 循环3.2 while 循环3.3 until 循环3.4 无限循环3.5 跳出循环3.5.1 break 跳出所有循环3.5.2 continue 仅跳出当前循环 【 1. if else 判断 】 1.1 if fi 是…

国际新产品开发专业认证-NPDP

&#x1f451;NPDP认证是美国产品开发管理协会(PDMA)所发起的新产品开发专业认证&#xff0c;是国际公认的wei一的新产品开发专业认证。 ✍&#x1f3fb;NPDP考试每年考2次&#xff0c;分别在每年的5月和11月。考试一共200道单选题&#xff0c;做对150道及格通过考试。 &#x…

应用层

title: 应用层 date: 2023-12-20 21:03:48 tags: 知识总结 categories: 计算机网络 应用层&#xff1a;负责最直观的应用请求的封装、发起 一、域名系统DNS 连接在互联网上的主机不仅有IP地址&#xff0c;还有便于用户记忆的主机名字。域名系统DNS能够把互联网上的主机的名字…

亲测有效:腾讯云免费服务器30天申请流程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

【Unity】如何在Unity中使用C#的NuGet 包资源

【背景】 Unity的脚本语言是C#&#xff0c;而C#有很多功能和能力可以通过nuget包提供。有没有办法把这些能力结合到Unity中一起使用呢&#xff1f;如果可以&#xff0c;那将大大扩展Unity中各类功能实现的便捷性。 【方法】 答案是&#xff1a;你可以&#xff01; 获取Nuge…

uniapp使用tcp和udp的区别和例子

在Node.js中&#xff0c;主要有三种socket&#xff1a;TCP&#xff0c;UDP和Unix域套接字。以下分别介绍这TCP/UDP的使用方法和示例&#xff1a; TCP socket TCP socket提供了可靠的、面向连接的通信流&#xff0c;适用于需要可靠传输的应用&#xff0c;例如Web浏览器的HTTP请…

[实践总结] java XML解析防止外部实体注入

防止部实体注入 /*** 增加防止部实体注入逻辑*/ public static void setReaderFeature(SAXReader reader) throws SAXException {// 禁用DTDreader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);// 禁用外部DTDreader.setFeature(&qu…

cpu缓存一致性

文章目录 cpu缓存一致性缓存的出现&#xff1a;多核之后带来的缓存一致性问题&#xff0c;如何解决LOCK 指令&#xff08;刚好可以实现上述的目标&#xff09;LOCK 指令特性内存屏障特性编译器屏障的作用MESI协议为什么有了 MESI协议 还需要 内存屏障问题&#xff1a;总结&…

创建第一个SpringMVC项目,入手必看!

文章目录 创建第一个SpringMVC项目&#xff0c;入手必看&#xff01;1、新建一个maven空项目&#xff0c;在pom.xml中设置打包为war之前&#xff0c;右击项目添加web框架2、如果点击右键没有添加框架或者右击进去后没有web框架&#xff0c;点击左上角file然后进入项目结构在模块…