第三章 Jinja2模板

2023-10-26

第三章 Jinja2模板

在前面的实例中,视图函数的主要作用是生成请求的响应,这是最简单请求.实际上,视图函数有两个作用:

  • 处理业务逻辑
  • 返回响应内容

在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本.

  • 模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取
  • 使用真实值替换变量,再返回最终得到的字符串,这个过程称为’渲染’
  • Flask是使用Jinja2这个模板引擎来渲染模板

使用模板的好处

  • 视图函数只负责业务逻辑和数据处理(业务逻辑方面)
  • 而模板则取到视图函数的数据结果进行展示(试图展示方面)
  • 代码结构清晰,耦合度低

1、Jinja2模板介绍

Jinja2:是Python的Web项目中被广泛应用的模板引擎,是由Python实现的模板语言,Jinja2 的作者也是 Flask 的作者。他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。

jinja2之所以被广泛使用是因为它具有以下优点:

  • 1、相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
  • 2、相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
  • 3、相对于Django模板,jinja2性能更好。
  • 4、Jinja2模板的可读性很棒。

要渲染一个模板,通过 render_template 方法即可。

模板传参

1、在使用 render_template 渲染模版的时候,可以传递关键字参数(命名参数)。以后直接在模版中使用就可以了。

2、 如果你的参数项过多,那么可以将所有的参数放到一个字典中,或者列表中都可以。一般如果想将字典打散成关键字参数可以在参数的前面加 **

from flask import Flask, render_template, redirect, request 
app = Flask(__name__) 
STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}
STUDENT_LIST = [ 
	{'name': 'Old', 'age': 38, 'gender': '中'}, 
	{'name': 'Boy', 'age': 73, 'gender': '男'}, 
	{'name': 'EDU', 'age': 84, 'gender': '女'} 
]
STUDENT_DICT = { 
	'a': {'name': 'Old', 'age': 38, 'gender': '中'}, 
	'b': {'name': 'Boy', 'age': 73, 'gender': '男'}, 
	'c': {'name': 'EDU', 'age': 84, 'gender': '女'}, 
}

@app.route("/student") 
def detail(): 
	#print(url_for("detail")) 
	return render_template("student.html", **STUDENT) 

@app.route("/detail_list", ) 
def detail_list(): 
	return render_template("student_list.html", stu_list=STUDENT_LIST)
	 
@app.route("/detail_dict") 
def detail_dict(): 
	return render_template("student_dict.html", stu_dict=STUDENT_DICT)

语法

在jinja2中,存在三种语法:

  1. 控制结构 (逻辑代码){% %}
  2. 变量取值 {{ }}
  3. 注释 {# #}

2、表达式

  • 最常用的是变量,由Flask渲染模板时传过来,比如name

  • 也可以是任意一种Python基础类型,比如字符串{{stu_list}};或者数值,列表,元祖,字典,布尔值。

  • 运算。包括算数运算,如{{ 2 + 3 }};比较运算,如{{ 2 > 1 }};逻辑运算,如{{ False and True }}

  • 过滤器|和测试器is

  • 函数调用,如{{ current_time() }};

  • 数组下标操作,如{{ arr[1] }}

  • in操作符,如{{ 1 in [1,2,3] }}

  • 字符串连接符~,作用同Python中的 “+” 一样,如{{ "Hello " ~ name ~ “!” }}

  • None值处理{{name or “”}

3、控制语句

Jinja2的控制语句主要就是条件控制语句if,和循环控制语句for,语法类似于Python if-else:

条件判断语句:

{% if name and name == 'admin' %} 
	<h1>This is admin console</h1> 
{% elif name %} 
	<h1>Welcome {{ name }}!</h1> 
{% else %} 
	<h1>Please login</h1> 
{% endif %} 
for循环语句: 
	{% for stu in stu_list%} 
		{{ stu }} 
	{% endfor %} 

### 

比如:

<!DOCTYPE html> 
<html lang="en"> 
<head>
	<meta charset="UTF-8"> 
	<title>Title</title> 
</head> 
<body> 
{{ stu_list }} 
<table border="1px"> 
	<tr>
		<td>name</td> 
		<td>age</td> 
		<td>gender</td>
	</tr> 
	{% for stu in stu_list %} 
		{% if stu.name != "Old" %} 
			{% if stu.age != 73 %} 
				<tr>
					<td>{{ stu.name }}</td> 
					<td>{{ stu.get("age") }}</td> 
					<td>{{ stu["gender"] }}</td> 
				</tr> 
			{% endif %} 
		{% endif %} 
	{% endfor %} 
</table> 
</body> 
</html> 

或者:

<!DOCTYPE html> 
<html lang="en">
<head>
	<meta charset="UTF-8"> 
	<title>Title</title> 
</head> 
<body> 
{{ stu_dict }} 
<table border="1px"> 
	<tr>
		<td>id</td> 
		<td>name</td> 
		<td>age</td> 
		<td>gender</td> 
	</tr> 
	{% for stu_key,stu_value in stu_dict.items() %} 
		<tr>
			<td>{{ stu_key }}</td> 
			<td>{{ stu_value.get("name") }}</td> 
			<td>{{ stu_value.age }}</td> 
			<td>{{ stu_value.gender }}</td> 
		</tr> 
	{% endfor %} 
</table> 
</body> 
</html>

4、过滤器

什么是过滤器? 实质上就是一个转换函数。变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置

函数和字符串处理函数。

常用的过滤器有:

过滤器名称 说明
safe 渲染时值不转义
capitialize 把值的首字母转换成大写,其他子母转换为小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML标签都删掉
join 拼接多个值为字符串
replace 替换字符串的值
round 默认对数字进行四舍五入,也可以用参数进行控制
int 把值转换成整型

1、字符串的过滤器

<body> 
{# 当变量未定义时,显示默认字符串,可以缩写为d #} 
<p>{{ name | default('No name') }}</p> 
{# 单词首字母大写 #} 
<p>{{ 'hello world' | capitalize }}</p> 
{# 单词全小写 #} 
<p>{{ 'XML' | lower }}</p> 
{# 去除字符串前后的空白字符 #} 
<p>{{ ' hello ' | trim }}</p> 
{# 字符串反转,返回"olleh" #} 
<p>{{ 'hello' | reverse }}</p> 
{# 格式化输出,返回"Number is 99" #} 
<p>{{ '%s is %d' | format("Number", 99) }}</p> 
{# 关闭HTML自动转义 #} 
<p>{{ '<em>name</em>' | safe }}</p> 
{% autoescape false %} 
{# HTML转义,即使autoescape关了也转义,可以缩写为e #} 
<p>{{ '<em>name</em>' | escape }}</p> 
{% endautoescape %}

2、数值的过滤器

</body> 
{# 四舍五入取整,返回13.0 #} 
<p>{{ 12.98 | round }}</p> 
{# 向下截取到小数点后2位,返回12.88 #} 
<p>{{ 12.8888 | round(2, 'floor') }}</p> 
{# 绝对值,返回12 #} 
<p>{{ -12 | abs }}</p> 

3、列表相关的过滤器

{# 取第一个元素 #} 
<p>{{ [1,2,3] | first }}</p> 
{# 取最后一个元素 #} 
<p>{{ [1,2,3] | last }}</p> 
{# 返回列表长度,可以写为count #} 
<p>{{ [1,2,3,4,5] | length }}</p> 
{# 列表求和 #} 
<p>{{ [1,2,3,4,5] | sum }}</p> 
{# 列表排序,默认为升序 #} 
<p>{{ [3,2,1,5,4] | sort }}</p> 
{# 合并为字符串,返回"1 | 2 | 3 | 4 | 5" #} 
<p>{{ [1,2,3,4,5] | join(' | ') }}</p> 
{# 列表中所有元素都全大写。这里可以用upper,lower,但capitalize无效 #} 
<p>{{ ['alex','bob','ada'] | upper }}</p> 

4**、字典相关的过滤器**

{% set users=[{'name':'Tom','gender':'M','age':20}, 
				{'name':'John','gender':'M','age':18},
				{'name':'Mary','gender':'F','age':24}, 
				{'name':'Bob','gender':'M','age':31}, 
				{'name':'Lisa','gender':'F','age':19}] 
%}

{# 按指定字段排序,这里设reverse为true使其按降序排 #} 
<ul> 
{% for user in users | sort(attribute='age', reverse=true) %} 
	<li>{{ user.name }}, {{ user.age }}</li> 
{% endfor %} 
</ul> 

{# 列表分组,每组是一个子列表,组名就是分组项的值 #} 
<ul> 
{% for group in users|groupby('gender') %} 
	<li>{{ group.grouper }}<ul> 
	{% for user in group.list %} 
		<li>{{ user.name }}</li> 
	{% endfor %}</ul></li> 
{% endfor %} 
</ul> 

{# 取字典中的某一项组成列表,再将其连接起来 #} 
<p>{{ users | map(attribute='name') | join(', ') }}</p> 

5、自定义过滤器

# 第一种方式 
def get_even_list(l): 
	return l[::2] 
# 函数的第一个参数是过滤器函数,第二个参数是过滤器名称 
app.jinja_env.filters['even_filter'] =get_even_list 
# 第二种方式 
@app.template_filter() # 过滤器函数 
def is_even(num): 
	if num % 2 == 0: 
		return "even number" 
	else:
		return "odd number" 

模板中:

<p>{{ [1,2,3,4,5] | even_filter }}</p> 

<p>{{ 2 | is_even }}</p>

5、测试器

测试器总是返回一个布尔值,它可以用来测试一个变量或者表达式,使用”is”关键字来进行测试。

{% set name='ab' %} 
{% if name is lower %} 
	<h2>"{{ name }}" are all lower case.</h2> 
{% endif %} 

测试器本质上也是一个函数,它的第一个参数就是待测试的变量,在模板中使用时可以省略去。如果它有第二个参数,模板中就必须传进去。测试器函数返回的必须是一个布尔值,这样才可以用来给if语句作判断。

1、Jinja2中内置的测试器

官网:https://jinja.palletsprojects.com/en/master/templates/#builtin-tests

{# 检查变量是否被定义,也可以用undefined检查是否未被定义 #} 
{% if name is defined %} 
	<p>Name is: {{ name }}</p> 
{% endif %} 
{# 检查是否所有字符都是大写 #} 
{% if name is upper %} 
	<h2>"{{ name }}" are all upper case.</h2> 
{% endif %} 
{# 检查变量是否为空 #} 
{% if name is none %} 
	<h2>Variable is none.</h2> 
{% endif %} 
{# 检查变量是否为字符串,也可以用number检查是否为数值 #} 
{% if name is string %} 
	<h2>{{ name }} is a string.</h2> 
{% endif %} 
{# 检查数值是否是偶数,也可以用odd检查是否为奇数 #} 
{% if 2 is even %} 
	<h2>Variable is an even number.</h2> 
{% endif %} 
{# 检查变量是否可被迭代循环,也可以用sequence检查是否是序列 #} 
{% if [1,2,3] is iterable %} 
	<h2>Variable is iterable.</h2> 
{% endif %} 
{# 检查变量是否是字典 #} 
{% if {'name':'test'} is mapping %} 
	<h2>Variable is dict.</h2>
{% endif %} 

2、自定义测试器

# 自定义测试器 
# 第一种方式 
import re 
def test_tel(tel_num): 
	tel_re = r'\d{11}' 
	return re.match(tel_re,tel_num) 
app.jinja_env.tests['is_tel'] = test_tel 
# 第二种方式 
@app.template_test('start_with') 
def start_with(str, suffix): 
	return str.lower().startswith(suffix.lower()) 

模板中:

{% set tel = '18910171111' %} 
{% if tel is is_tel %} 
	<h2>{{ tel }} is mobile phone</h2> 
{% endif %} 
{% set name = 'Hello world' %} 
{% if name is start_with 'hello' %} 
	<h2>"{{ name }}" start_with "hello"</h2> 
{% endif %} 

6、块和继承

一般我们的网站虽然页面多,但是很多部分是重用的,比如页首,页脚,导航栏之类的。对于每个页面,都要写这些代码,很麻烦。

Flask的Jinja2模板支持模板继承功能,省去了这些重复代码。

父模板:

<body> 
你好,template1 
{% block template1 %} 
{% endblock %} 

你好,template2 
{% block template2 %} 
{% endblock %} 

你好,template
{% block template %} 
{% endblock %} 
</body> 

子模版:

{% extends "he.html" %} 

{% block template %} 
	{{ super() }} 
	<h1>yuan</h1> 
{% endblock %} 

{% block template1 %} 
	{{ super() }} 
	<h1>alex</h1> 
{% endblock %} 

include标签

这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置。 include 标签,如果想要使用父模版中的变量,直接用就可以了。 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>

7、模板中使用url_for

模版中的 url_for 跟我们后台视图函数中的 url_for 使用起来基本是一模一样的。也是传递视图函数的名字,也可以传递参数。使用的时候,需要在 url_for 左右两边加上一个 {{ url_for('func') }}

1、动态超链接

html页面使用如: 
<a href="{{ url_for('login',p1='abc',p2='ddd',name='momo') }}">登录</a> 
本质上就是动态路由 
点击变为: 
http://127.0.0.1:5000/accounts/login/momo/?p1=abc&p2=ddd 

对应的视图函数:

@app.route('/accounts/login/<name>/') 
def login(name): 
	print(name) 
	return render_template('login.html') 

或者也可以不用动态路由:

html页面使用如: 
<a href="{{ url_for('login',p1='abc',p2='ddd') }}">登录3</a> 
点击变为: 
http://127.0.0.1:5000/accounts/login/?p1=abc&p2=ddd

2、加载静态文件

静态文件:css文件 js文件 图片文件等文件

加载静态文件使用的是 url_for 函数。然后第一个参数需要为 static ,第二个参数需要为一个关键字参数

filename='路径'

语法:
{{ url_for(“static”,fifilename=‘xxx’) }}

<link href="{{ url_for('static',filename='css/main.css') }}" rel="stylesheet"> 
<script src="{{ url_for('static',filename='js/main.js') }}"></script> 
<img src="{{ url_for('static',filename='img/main.jpg') }}"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第三章 Jinja2模板 的相关文章

  • Python BigQuery 存储。并行读取多个流

    我有以下玩具代码 import pandas as pd from google cloud import bigquery storage v1beta1 import os import google auth os environ G
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar

随机推荐

  • druid 配置

    spring datasource druid连接池 type com alibaba druid pool DruidDataSource 数据库驱动 driver com mysql jdbc Driver 最大连接池数量 max ac
  • 开源协议详解

    开源在今天的软件业已经很普遍 但开源是否意味着使用者可以对开源后的代码为所欲为呢 答案是否定的 开源运动同样有自己的游戏规则和道德准则 不遵行这些规则不但损害开源运动的健康发展 也会对违规者造成名誉和市场上的损失 更可能陷入法律纠纷和赔偿
  • gitlab Undefined method `provider' for nil:nilclass 登陆提示处理

    使用管理员用户 在管理区域 用户管理里面 搜索对应用户 修改用户身份里面的LDAP身份为正确信息
  • 【基础】Unity:Application的常用方法

    Application的常用方法 static void LoadLevel int index static void LoadLevel string name static void CaptureScreenShot string
  • php使用区块链_PHP实现区块链

    作者 列旭松 来源 高可用架构 原文链接 http t cn RgjsJ1i 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 来自 Linux内核那些事 微信号 like linux 作者 列旭松 唯品会资深工程师 曾任
  • C++标准演绎(未完)

    作者 略游 q群 512 001 256 一 词汇定义 标准 standard C 语言标准 在代码世界里 我们假设与公理等价 结论 由标准推导出的事实 规定 便于讨论 我们设定的一些规则 类型 type 同一类型 它们在C 内存布局一致
  • 简谈拉电阻

    简谈拉电阻 前言 拉电阻 弱拉和强拉 上拉和下拉 前言 电路设计中经常设计到拉电阻的概念 与常用的GPIO口的配置也息息相关 网上也有很多的总结 不多累述 简单的总结拉电阻相关的一些概念 拉电阻 拉电阻分为上拉电阻 pull up 和下拉电
  • powerdesigner常用配置-修改外键设置

    文章目录 取消自动生成外键列 PowerDesigner给两个表添加reference 中间显示外键信息步骤 取消自动生成外键列 PowerDesigner给两个表添加reference 中间显示外键信息步骤
  • Floyd算法(三)之 Java详解

    前面分别通过C和C 实现了弗洛伊德算法 本文介绍弗洛伊德算法的Java实现 目录 1 弗洛伊德算法介绍 2 弗洛伊德算法图解 3 弗洛伊德算法的代码说明 4 弗洛伊德算法的源码 转载请注明出处 http www cnblogs com sk
  • 记一次XFS文件系统崩溃的处理

    1 问题出现 当使用rpm安装服务时 出现如下问题 当使用yum时也是一样 查了 var log messages发现以下错误 看起来是XFS的问题 可以发现dm 0实际是bel root的问题 查了网上很多解决方法都是说要使用xfs re
  • TCP/IP 报文格式(IP数据包、TCP报头、UDP报头)

    TCP IP 报文格式 IP数据包 TCP报头 UDP报头 一 IP包格式 IP数据包 是一种可以变长的分组 由首部与数据负载组成 首部长度为20 60字节 Byte 后40字节是可选的 但长度不固定 前20字节格式为固定 数据负载部分的长
  • 医疗器械维修工程师好做吗?赚钱吗?

    彩虹医疗器械维修培训第二期长期班安排 学技术 考证书 工作技术支持 彩虹介绍 彩虹医械维修培训中心成立于2003年 至今已有十余年的时间 为满足社会需求 推进医疗器械维修技术发展 开展医疗器械的维修技术培训 在社会上取得了良好的反应和口碑
  • 嵌入式Linux驱动开发(I2C专题)(四)

    编写APP直接访问EEPROM 参考资料 Linux驱动程序 drivers i2c i2c dev c I2C Tools 4 2 https mirrors edge kernel org pub software utils i2c
  • 在 Kubernetes 上体验 EMQX 5.0 的 MQTT over QUIC 特性

    引言 作为全球领先的开源分布式 MQTT Broker EMQX 在 5 0 版本中引入了 MQTT over QUIC 将 MQTT 协议的优势与 QUIC 的特性相结合 通过充分利用 QUIC 协议低连接开销和多路复用的特点 MQTT
  • 入职避坑指南(杭州)

    前言 求职都说金三银四 今天和大家分享一个亲身经历的事情 今天讲的是杭州 群电商公司 规模500人左右 说说我被公司白瞟的亲身经历 希望看到这篇文章的同学能避开这些坑 面试过程 公司比较远 附近没有地铁 大概坐了一个多小时的公交车去面试 到
  • CompletableFuture使用详解

    https blog csdn net admin123404 article details 111168902
  • Centos7.9搭建kafka-3.2.0集群,三台机器组成,并安装安装eagle 监控

    目录 1 准备工作 2 搭建zookeeper集群 3 搭建kafka集群 4 测试kafka集群 4 1 命令测试 4 2 java代码测试 5 安装eagle 监控 1 准备工作 kafka 3 2 0的单机安装教程如下 CentOS7
  • MySQL的全连接

    从这篇博客开始 从高端大气的计算机视觉方向转行做JAVA开发了 接下来的博客就是JavaJavaJava了没有世界上最好用的pythonpythonpython 由于MySQL不支持FULL JOIN 所以 需要使用UNION来实现全连接
  • 一、多路复用

    1 什么是多路复用 数据通信系统或计算机网络系统中 传输媒体的带宽或容量往往会大于传输单一信号的需求 为了有效地利用通信线路 希望一个信道同时传输多路信号 这就是所谓的多路复用技术 Multiplexing 采用多路复用技术能把多个信号组合
  • 第三章 Jinja2模板

    第三章 Jinja2模板 在前面的实例中 视图函数的主要作用是生成请求的响应 这是最简单请求 实际上 视图函数有两个作用 处理业务逻辑 返回响应内容 在大型应用中 把业务逻辑和表现内容放在一起 会增加代码的复杂度和维护成本 模板其实是一个包