Python框架【自定义过滤器、自定义数据替换过滤器 、自定义时间过滤器、选择结构、选择练习、循环结构、循环练习、导入宏方式 】(三)

news2024/12/28 8:07:24

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战 

🔥🔥🔥 Python爬虫开发专栏:从入门到实战

🔥🔥🔥 Python办公自动化专栏:从入门到实战

🔥🔥🔥 Python数据分析专栏:从入门到实战

🔥🔥🔥 Python前后端开发专栏:从入门到实战

文章目录

自定义过滤器

自定义数据替换过滤器 

自定义时间过滤器

流程控制-选择结构

 流程控制-选择练习

流程控制-循环结构

 流程控制-循环练习

宏的使用

 定义宏

使用宏

导入宏方式 

导入模板include 

 set与with标签

静态文件


自定义过滤器

 只有当系统提供的过滤器不符合需求后,才须自定义过滤器 过滤器本质上就是一个函数。

如果在模版中调用这个过滤器,那么就会将这个变量的值作为第一 个参数传给过滤器这个函数, 然后函数的返回值会作为这个过滤器的返回值。

需要使用到一个装饰器: @app.template_filter('过滤器名称')

自定义数据替换过滤器 

例如:将新闻中出现的 所有“ 我是九你是三,除了你还是你” 换成 "你不用多好,我喜欢就好"

#将模版设置为自动加载模式
app.config['TEMPLATES_AUTO_RELOAD']=True
@app.template_filter('cut')
def cut(value):
    value=value.replace("我是九你是三,除了你还是你",'你不用多好,我喜欢就好')
    return value
<p>使用自定义过滤器:{{新闻内容值|cut}}</p>

自定义时间过滤器

例如:操作发布新闻 与现在的时间间隔

from datetime import datetime
#需求:操作发布新闻 与现在的时间间隔
@app.template_filter('handle_time')
def handle_time(time):
      """
       time距离现在的时间间隔
       1. 如果时间间隔小于1分钟以内,那么就显示“刚刚”
       2. 如果是大于1分钟小于1小时,那么就显示“xx分钟前”
       3. 如果是大于1小时小于24小时,那么就显示“xx小时前”
       4. 如果是大于24小时小于30天以内,那么就显示“xx天前”
       5. 否则就是显示具体的时间 2030/10/20 16:15
       """
      if isinstance(time, datetime):
          now = datetime.now()
          timestamp = (now - time).total_seconds()
          if timestamp < 60:
              return "刚刚"
          elif timestamp >= 60 and timestamp < 60 * 60:
              minutes = timestamp / 60
              return "%s分钟前" % int(minutes)
          elif timestamp >= 60 * 60 and timestamp < 60 * 60 * 24:
              hours = timestamp / (60 * 60)
              return '%s小时前' % int(hours)
          elif timestamp >= 60 * 60 * 24 and timestamp < 60 * 60 * 24 * 30:
              days = timestamp / (60 * 60 * 24)
              return "%s天前" % int(days)
          else:
              return time.strftime('%Y/%m/%d%H:%M')
      else:
          return time
<p>发布时间:{{新闻创建时间|handle_time}}</p>

流程控制-选择结构

 所有的控制语句都是放在 {% ... %} 中,并且有一个语句 {% endxxx %} 来进行结束!

if:if语句和python中的类似,可以使用 >,=,==,!= 来进行判 断,也可以通过 and,or,not,() 来进行逻辑合并操作

<h1>选择结构</h1>
{% if uname == 'aps' %}
<p>艾派森</p>
{% endif %}
{% if uname == 'aps' %}
<p>艾派森</p>
{% else %}
<p>小王程序员</p>
{% endif %}
{% if uname == 'aps' %}
<p>艾派森</p>

{% elif uname == 'xiaowang'%}
<p>小王程序员</p>
{% else %}
<p>学Python 找小王程序员!!</p>
{% endif %}
{% if age >= 18 %}
    <p>{{ age }}岁,成年人,可以通宵打游戏</p>
{% else %}
    <p>{{ age }}岁,未成年人,可以通宵学习</p>
{% endif %}
@app.route('/')
def index():
    uname = 'xiaotong3'
    return
render_template('index2.html',uname = uname)

注意:

if 条件判断语句必须放在 {% if statement %} 中间,并且还必须有结束的标签 {% endif %} 。

 流程控制-选择练习

 python

from flask import
Flask,render_template,request

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/login')
def login():
    user = request.args.get('user')
    return render_template('index.html',user = user)

if __name__ =='__main__':
    app.run(debug=True)

template

<body>
    <span>中国大陆</span>
   {% if not user %}
        <a href="{{url_for('login',user='吕布')}}">亲,请登录</span></a>
        <span>免费注册</span>
   {% else %}
        <span>{{ user }}</span>
   {% endif %}
    <span>手机淘宝</span>
</body>

流程控制-循环结构

 for...in... for 循环可以遍历任何一个序列包括列表、字典、元组。并且可以进行反向遍历,以下将用几个例子进行解释:

列表

<ul>
   {% for user in users%}
       <li>{{ user}}</li>
   {% endfor %}
</ul>

遍历字典

<tr>
   {% for key in person.keys() %}
        <td>{{ key}}</td>
   {% endfor %}
</tr>
<tr>
   {% for val in person.values() %}
        <td>{{ val}}</td>
   {% endfor %}
</tr>
<tr>
   {% for item in person.items() %}
        <td>{{ item}}</td>
   {% endfor %}
</tr>
<tr>
   {% for key,value in person.items() %}
        <td>{{ value}}</td>
   {% endfor %}
</tr>

如果序列中没有值的时候,进入else 反向遍历用过滤器 reverse:

<ul>
   {% for user in users|reverse %}
       <li>{{ user}}</li>
   {% else %}
        <li>没有任何用户</li>
   {% endfor %}
</ul>

并且Jinja中的for循环还包含以下变量,可以用来获取当前的遍历状态:

变量描述
oop.index当前迭代的索引(从1开始)
loop.index0当前迭代的索引(从0开始)
loop.first是否是第一次迭代,返回True或False
loop.last是否是最后一次迭代,返回True或False
loop.length7序列的长度

总结

jinja2 中的 for 循环,跟 python 中的 for 循环基本上是一模一样的也是 for...in... 的形式。并且也可以遍历所有的序列以及迭代器唯一不同的是, jinja2 中的 for 循环没有 break 和 continue 语句

 流程控制-循环练习

{% for x in range(1,10) %}
     <tr>
       {% for y in range(1,x + 1) %}
           <td>{{y}}*{{x}}={{ x*y }}</td>
       {% endfor %}
     </tr>
{% endfor %}

宏的使用

 模板中的宏跟python中的函数类似,可以传递参数,但是不能有返回值

可以将一些经常用到的代码片段放到宏中,然后6把一些不固定的值抽取出来当成一个变量

 定义宏

{% macro input(name,value="",type="text") %}
  <input type="{{type}}" name="{{name}}" value="{{value}}">
{% endmacro %}

使用宏

<table>
    <tr>
        <td>用户名:</td>
        <td>{{ input('username')}}</td>
    </tr>
    <tr>
        <td>密码:</td>
        <td>
           {{ input('pwd',type='password') }}
        </td>
    </tr>
    <tr>
        <td></td>
        <td>{{ input(value='提交',type='submit') }}</td>
    </tr>
</table>

访问结果

提示

实际开发中,不会把宏在一个页面内定义并直接使用 一般把宏定义放到一个专门的文件夹中,方便进行统一管理之后,哪一个页面需要使用某个宏,需要导入宏才能使用

导入宏方式 

1. from '宏文件的路径' import 宏的名字 [as xxx]。

{% from "users/users.html" import input as inp %}

2. import "宏文件的路径" as xxx [with context]

{% import "users/users.html" as usr  with context %}

注意

1. 宏文件路径,不要以相对路径去寻找,都要以 templates 作为绝对路径去找

2. 如果想要在导入宏的时候,就把当前模版的一些参数传给宏所在的模版,那么就应该在导入的时候使用 with context

{% import "users/users.html" as usr  with context %}

导入模板include 

1. 这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置。

2. include 标签,如果想要使用父模版中的变量,直接用就可以了,不需要使用 with context 。

3. include 的路径,也是跟 import 一样,直接从 templates 根目录下去找, 不要以相对路径去找。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SXT</title>
</head>
<body>
    <!--通过include 引入头部log信息-->
   {% include "common/head.html" %}
    <div>
       这是首页内容
       {{ major }}
    </div>
    <hr>
   <!--通过include 引入底部版权信息-->
   {% include "common/footer.html" %}
</body>
</html>

 set与with标签

 set的使用

在模版中,可以使用 set 语句来定义变量

<!--set语句来定义变量,之后,那么在后面的代码中,都可以使用这个变量-->
{% set uname='sxt'%}
<p>用户名:{{ uname }}</p>

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

with语句 

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

<!--with语句来定义变量,只有在指定区域 才能使用这个变量-->
{% with classroom='python202'%}
    <p>班级:{{ classroom }}</p>
{% endwith %}

 注意

关于定义的变量, with 语句也不一定要跟一个变量, 可以定义一个空的 with 语句, 需要在指定的区域才能使用的情况,可以set与with组合使用。

{% with %}
 {% set  pname='李思思' %}
   <p>娱乐县县长:{{ pname }}</p>
{% endwith %}

静态文件

 静态文件

静态文件:css文件 js文件 图片文件等文件 加载静态文件使用的是 url_for 函数。然后第一个参数需要为 static ,第 二个参数需要为一个关键字参数 filename='路径' 。

语法

{{ url_for("static",filename='xxx') }}

例如

注意

路径查找,要以当前项目的 static 目录作为根目录

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

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

相关文章

【OpenMp】openmp库的介绍及安装

目录 什么是OpenMPOpenMP的工作原理Amdahl 定律Gustafson 定律openmp的库在ubuntu下的编译 什么是OpenMP OpenMP&#xff08;Open Multi-Processing&#xff09;是一种并行编程框架&#xff0c;用于在共享内存系统中实现并行计算。它是GCC编译器的一部分&#xff0c;提供了一组…

向量检索:基于ResNet预训练模型构建以图搜图系统

1 项目背景介绍 以图搜图是一种向量检索技术&#xff0c;通过上传一张图像来搜索并找到与之相关的其他图像或相关信息。以图搜图技术提供了一种更直观、更高效的信息检索方式。这种技术应用场景和价值非常广泛&#xff0c;经常会用在商品检索及购物、动植物识别、食品识别、知…

leetcode48. 旋转图像(java)

旋转图像 题目描述旋转技巧上期经典算法 题目描述 难度 - 中等 原题链接 - 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像…

StreamPark

1、StreamPark的标语 一个神奇的框架&#xff0c;让流处理更简单 2、StreamPark的前世今生 早期用名streamx&#xff0c;加入apache孵化器之后更名为StreamPark 3、StreamPark可以为你提供什么 降低学习成本、开发门槛&#xff0c;让开发者只用关心核心的业务 简单来说&#xf…

Pytorch学习:torchvison.transforms常用包(ToTensor、Resize、Compose和RandomCrop)

transforms常用包 1. torchvision.transforms.ToTensor2. torchvision.transforms.Resize3. torchvision.transforms.Compose4. torchvision.transforms.Normalize5. torchvision.transforms.RandomCrop 1. torchvision.transforms.ToTensor 将PIL Image或ndarray转换为张量并…

基于React实现无限滚动的日历详细教程,附源码【手写日历教程第二篇】

前言 最常见的日历大部分都是滚动去加载更多的月份&#xff0c;而不是让用户手动点击按钮切换日历月份。滚动加载的交互方式对于用户而言是更加丝滑和舒适的&#xff0c;没有明显的操作割裂感。 那么现在需要做一个这样的无限滚动的日历&#xff0c;前端开发者应该如何去思考…

【数据结构】实现栈和队列

目录 一、栈1.栈的概念及结构&#xff08;1&#xff09;栈的概念&#xff08;2&#xff09;栈的结构 2.栈的实现&#xff08;1&#xff09;类型和函数的声明&#xff08;2&#xff09;初始化栈&#xff08;3&#xff09;销毁&#xff08;4&#xff09;入栈&#xff08;5&#x…

在 Redis 中处理键值 | Navicat

Redis 是一个键值存储系统&#xff0c;允许我们将值与键相关联起来。与关系型数据库不同的是&#xff0c; 在Redis 中&#xff0c;不需要使用数据操作语言 &#xff08;DML&#xff09; 和查询语法&#xff0c;那么我们如何进行数据的写入、读取、更新和删除操作呢&#xff1f;…

shell 11(shell重定向输入输出)

一、标准输入输出 标准输入介绍 从键盘读取用户输入的数据&#xff0c;然后再把数据拿到Shell程序中使用; 标准输出介绍 Shell程序产生的数据&#xff0c;这些数据一般都是呈现到显示器上供用户浏览查看

go学习一之go的初体验

go语言学习笔记 一、golang初体验: 1.简单体验案例&#xff1a; package main{ //把这个test.go归属到main import "fmt" //引入一个包 func main(){//输出hellofmt.Println("hello world")} }2.从案例学到的知识点&#xff1a; (1) go文件的后缀是.…

【集合学习HashMap】HashMap集合详细分析

HashMap集合详细分析 一、HashMap简介 HashMap 主要用来存放键值对&#xff08;key-value的形式&#xff09;&#xff0c;它基于哈希表的 Map 接口实现&#xff0c;是常用的 Java 集合之一&#xff0c;是非线程安全的。 HashMap 可以存储 null 的 key 和 value&#xff0c;但 …

nginx基本介绍(安装、常用命令、反向代理)

文章目录 引言一、nginx是什么二、nginx的下载和安装1. 下载2. windows下安装3. 运行4. 外部服务器无法访问问题 三、nginx的常用命令四、nginx.config五、FileZilla1. 什么是FileZilla2. FileZilla的下载和安装 六、反向代理1. 什么是nginx的反向代理2. 反向代理工作流程3. 如…

2023-8-23 连通块中点的数量

题目链接&#xff1a;连通块中点的数量 #include <iostream>using namespace std;const int N 100010;int n, m; int p[N], Size[N], idx;int find(int x) {if(p[x] ! x) p[x] find(p[x]);return p[x]; }int main() {cin >> n >> m;for(int i 1; i <…

七、任务优先级和Tick

1、任务与中断的优先级 (1)相同优先级任务轮流执行。 (2)高优先级任务打断低优先级任务。 (3)中断可以打断所有优先级的任务。 2、任务优先级 (1)优先级的取值范围是&#xff1a;0~(configMAX_PRIORITIES – 1)&#xff0c;数值越大优先级越高。 (2)FreeRTOS会确保最高优…

API 网关基础

目录 一、网关概述二、网关提供的功能三、常见网关系统3.1 Netflix Zuul3.2 Spring Cloud Gateway3.3 Kong3.4 APISIX3.5 Shenyu 一、网关概述 API网关是一个服务器&#xff0c;是系统的唯一入口。 从面向对象设计的角度看&#xff0c;它与外观模式类似。API网关封装了系统内部…

小白带你学习linux的LVS集群(三十六)

一、集群概述 1、负载均衡技术类型 四层负载均衡器 也称为 4 层交换机&#xff0c;主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡&#xff0c;如常见的 LVS、F5 等&#xff1b; 七层负载均衡器 也称为 7 层交换机&#xff0c;位于 OSI 的最高层&#…

机器人力控入门——牛顿欧拉法动力学建模

建立机器人的动力学模型是完成力控的基础&#xff0c;常用的动力学模型建模法有拉格朗日法和牛顿-欧拉法&#xff0c;其中牛顿-欧拉采用递推形式&#xff0c;计算更为简便&#xff0c;使用也更为广泛。本文就来介绍下牛顿-欧拉的动力学建模方法&#xff0c; PS&#xff0c;网上…

C++--动态规划两个数组的dp问题

1.最长公共子序列 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串…

day 37 | ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 与前一道分割等和子集的思路差不多&#xff0c;都是01背包问题。因为是采用滚动数组的形式&#xff0c;所以必须要倒序遍历才可以。 dp[i]代表着在i的限制下最大的承重。所以另一半就是all - dp【all / 2】 func lastStoneWeightII(stones []int…

Fabric.js 元素选中状态的事件与样式

本文简介 带尬猴&#xff01; 你是否在使用 Fabric.js 时希望能在选中元素后自定义元素样式或选框&#xff08;控制角和辅助线&#xff09;的样式&#xff1f; 如果是的话&#xff0c;可以放心往下读。 本文将手把脚和你一起过一遍 Fabric.js 在对象元素选中后常用的样式设置…