Flask 使用Jinja2模板引擎
Jinja2,由Flask框架的创作者开发,是一款功能丰富的模板引擎,以其完整的Unicode支持、灵活性、高效性和安全性而备受推崇。最初受Django模板引擎启发,Jinja2为Flask提供了强大的模板支持,后来也成为其他项目的首选。在本文中,我们将深入探讨Jinja2的特性、语法以及如何在Flask应用中使用它来构建动态而又美观的Web页面。
IF模板
IF语句用于在模板中执行条件判断,根据不同的条件呈现不同的内容。在模板中,通过{% if condition %} ... {% endif %}
的语法结构来定义条件块。其中,condition
是一个表达式或变量,如果该条件为真,模板引擎将执行if
块内的内容,否则将跳过。
IF模板语句支持多种条件判断,包括比较运算、逻辑运算等。通过合理运用IF语句,可以根据动态数据或用户输入,在页面上展示不同的信息或呈现不同的页面结构,从而实现更加灵活和个性化的页面设计。
// ----------------------------------------------
// 前端部分
// ----------------------------------------------
{% if username and username == "admin" %}<h1>hello {{ username }} welcome</h1>
{% elif username and username == "lyshark" %}<h1>hello {{ username }}</h1>
{% else %}<h1>hello lyshark</h1>
{% endif %}// ----------------------------------------------
// 后端部分
// ----------------------------------------------
@app.route("/", methods=["GET", "POST"])
def index():return render_template("index.html",username = "admin")
FOR模板
FOR循环模板语句允许在模板中对数据进行迭代操作,便于遍历集合、列表或字典等数据结构,并在模板中对每个元素执行相同的操作。通过{% for item in iterable %} ... {% endfor %}
的语法结构,可以定义一个FOR循环块。
在FOR循环中,item
表示每次迭代中当前的元素,而iterable
则是要遍历的数据集合。循环块内的代码将在每次迭代时执行,允许动态生成页面内容。此外,Jinja2的FOR循环还支持循环索引、循环计数等功能,提供了灵活的迭代控制机制。
FOR模板语句在Web开发中经常用于动态生成页面元素,特别是在展示多条数据、列表或表格内容时非常实用。通过FOR循环,开发者可以更方便地处理和展示动态数据,提高页面的灵活性和交互性。
// ----------------------------------------------
// 前端部分
// ----------------------------------------------
<!--输出列表-->
{% for x in digits %}<p>输出列表: {{ x }}</p>
{% endfor %}<!--输出字典-->
{% for item in dicts %}<!--第一个和最后一个元素-->{% if loop.first %}<b>第一个元素是: {{ item.name }}</b>{% elif loop.last %}<b>最后一个元素是: {{ item.name }}</b>{% endif %}<!--下标输出--><b>当前下标(从1开始): {{ loop.index }}</b><b>当前下标(从0开始): {{ loop.index0 }}</b><!--字典长度--><b>数组长度: {{ loop.length }}</b><b>迭代计数(从1开始): {{ loop.revindex }}</b><b>迭代计数(从0开始): {{ loop.revindex0 }}</b><p> 输出名字: {{ item.name }} 输出密码: {{ item.password }}</p>
{% endfor %}<!--输出元组-->
{% for href,caption in tuples %}<p>{{ href }} = {{ caption }}</p>
{% endfor %}// ----------------------------------------------
// 后端部分
// ----------------------------------------------
@app.route("/", methods=["GET", "POST"])
def index():return render_template("index.html",digits=[1,2,3,4,5],dicts=[{'name':'John','password':'123123'},{'name':'Tom', 'password':'123456'},{'name':'Lisa', 'password':'123123'},{'name':'Bob', 'password':'123456'}],tuples=[('index.html', 'Index'),('about.html', 'About'),('downloads.html', 'Downloads')])
FOR模板排序允许在模板中对循环输出的元素进行排序或分组操作,通过内置的过滤器实现。这提供了更灵活的控制机制,使得模板能够按照特定的顺序展示数据,或者将数据按照某个条件分组呈现。
通过结合FOR循环和排序过滤器,模板可以根据开发者的需求对数据进行动态排列。在模板中,使用类似于{% for item in iterable | sort %} ... {% endfor %}
的语法,可以对iterable
中的元素进行排序。除了简单的字母和数字排序外,Jinja2还支持通过自定义函数进行排序,提供了更高度定制的排序功能。
// ----------------------------------------------
// 前端部分
// ----------------------------------------------
<!-- 按指定字段排序,这里设reverse为true使其按降序排 -->
<ul>{% for item in dicts | sort(attribute='age', reverse=true) %}<li> 名字: {{ item.name }} 年龄: {{ item.age }}</li>{% endfor %}
</ul><!-- 列表分组,每组是一个子列表,组名就是分组项的值 -->
<ul>{% for group in dicts|groupby('gender') %}<li>组名: {{ group.grouper }}<ul>{% for user in group.list %}<li>用户: {{ user.name }}</li>{% endfor %}</ul></li>{% endfor %}
</ul><!-- 取字典中的某一项组成列表,再将其连接起来 -->
<p>连接后: {{ dicts | map(attribute='name') | join(', ') }}</p>
<p>连接后: {{ dicts | map(attribute='age') | join(', ') }}</p>// ----------------------------------------------
// 后端部分
// ----------------------------------------------
@app.route("/", methods=["GET", "POST"])
def index():return render_template("index.html",dicts = [{'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}])if __name__ == '__main__':app.run(debug=True)
模板闪现机制
闪现机制是一种在请求之间传递信息的有效方式。它允许在一个请求中设置数据,然后在下一个请求中访问这些数据。主要通过flash()
函数实现,使开发者能够方便地在请求之间传递和呈现信息,增强了用户体验。
闪现机制通过flash()
函数实现,主要分为三种:
- 基本闪现机制: 使用
flash(message, category='message')
函数将消息闪现到下一个请求。这个消息可以是字符串,也可以是其他数据类型,而category
参数用于指定消息的类别,通常默认为’message’。 - 消息分类: 闪现消息可以根据不同的类别进行分类,以便在前端页面中有更好的呈现形式。通过设置
category
参数,可以将消息划分为不同的类别,例如’error’、'success’等,以便在模板中有条件地处理这些消息。 - 模板中的处理: 在模板中,可以使用
get_flashed_messages(with_categories=False, category_filter=['error', 'warning'])
函数获取所有闪现的消息。通过with_categories
参数可以选择获取消息时是否携带类别信息,而category_filter
参数则可以指定只获取特定类别的消息。
这三种机制共同构成了Flask框架中灵活且强大的模板闪现系统,使得在Web应用中更便捷地实现消息传递和呈现。
1.模板中获取闪现信息,实现在下次请求时返回内容到前台。
<!--闪现消息,返回一个列表-->
{% with messages = get_flashed_messages() %}{% if messages %}<ul>{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>{% endif %}
{% endwith %}{% if error %}<p><strong>失败消息:</strong> {{ error }}</p>
{% endif %}<form action="" method=post>用户名: <input type=text name=username>密码: <input type=password name=password><input type=submit value="用户登录">
</form>
后端只需要在验证通过的情况下,直接调用flash()
函数实现消息的前台传递。
from flask import Flask, flash, redirect, render_template, request, url_forapp = Flask(__name__, template_folder="./tempate",static_folder="./tempate")
app.secret_key = 'some_secret'@app.route('/', methods=['GET', 'POST'])
def index():if request.method == "POST":if request.form['username'] != "lyshark" or request.form['password'] != "1233":flash("登录失败了")return render_template('index.html',error = "失败")else:flash("恭喜您登录成功")return render_template('index.html')if __name__ == "__main__":app.run()
2.模板中的分类闪现,在闪现消息是指定一个消息分了i,如果不指定则默认分类为Message消息。
要使用自定义的分类,只要使用flash()
函数传入第二个参数即可。
{% with messages = get_flashed_messages(with_categories=true) %}{% if messages %}<ul>{% for category, message in messages %}<li class="{{ category }}">{{ category }}:{{ message }}</li>{% endfor %}</ul>{% endif %}
{% endwith %}
后端只需要增加第二个参数来指定需要显现的分组即可。
@app.route('/', methods=['GET', 'POST'])
def index():if request.method == "POST":if request.form['username'] != "lyshark" or request.form['password'] != "1233":flash("登录失败了")return render_template('index.html',error = "失败")else:flash("恭喜您登录成功","status")flash("测试账户","username")return render_template('index.html')if __name__ == "__main__":app.run()
3.模板中过滤闪现消息,过滤闪现即指在前台通过category_filter
增加过滤条件,来实现对特殊消息的过滤输出。
<!--闪现消息,增加过滤器-->
{% with messages = get_flashed_messages(category_filter=["username","status"]) %}{% if messages %}<ul>{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>{% endif %}
{% endwith %}{% if error %}<p><strong>失败消息:</strong> {{ error }}</p>
{% endif %}<form action="" method=post>用户名: <input type=text name=username>密码: <input type=password name=password><input type=submit value="用户登录">
</form>
后端也可在闪现消息时指定一个category
属性实现过滤机制。
from flask import Flask, flash, redirect, render_template, request, get_flashed_messagesapp = Flask(__name__, template_folder="./tempate",static_folder="./tempate")
app.secret_key = 'some_secret'@app.route('/', methods=['GET', 'POST'])
def index():if request.method == "POST":if request.form['username'] != "lyshark" or request.form['password'] != "1233":flash("登录失败了")return render_template('index.html',error = "失败")else:flash("恭喜您登录成功","status")flash("测试新的闪现",category="username") # 输出到usernameflash("测试账户","username") # 闪现到usernameprint('闪现的信息是{}'.format(get_flashed_messages()))return render_template('index.html')if __name__ == "__main__":app.run()
自定义上下文
上下文是一个在请求处理过程中可以访问的全局对象集合。除了Flask本身提供的默认上下文之外,开发者还可以通过自定义上下文函数来添加额外的全局变量或函数,以便在视图函数和模板中使用。这就是自定义上下文函数的作用。
关键点和优势:
- 上下文函数的定义: 自定义上下文函数是通过
app.context_processor
装饰器定义的。这个函数会在每次请求处理前被调用,返回的字典中的键值对将成为全局变量。 - 全局变量的添加: 开发者可以在自定义上下文函数中添加一些全局变量,这些变量可以在所有视图函数和模板中直接访问,无需在每个视图函数中都进行传递。
- 公共函数的注入: 除了变量,还可以在自定义上下文函数中注入一些公共函数。这些函数可以用于处理数据、生成通用的HTML片段等。
- 模板中的使用: 自定义上下文函数中添加的变量可以直接在模板中使用,而无需在每个视图函数中都传递一遍。这简化了代码,提高了开发效率。
- 适用于多个视图: 自定义上下文函数中添加的内容对整个应用程序的多个视图都是可用的,因此非常适合用于那些需要在整个应用范围内共享的信息。
通过合理使用自定义上下文函数,可以使Flask应用更加灵活、可维护,并提供一致的全局信息和功能。这种机制有助于将一些通用的操作和数据注入到应用中,提高了代码的可读性和可重用性。
下面我们就来先定义一个上下文变量以及上下文函数,将返回字典的属性指向一个函数即可。
<p>当前APP名字: {{ app_name }}</p>
<p>当前时间戳: {{ local_time }}</p>
<p>当前名字: {{ local_user }}</p><p>当前时间: {{ current_time() }}</p>
<p>格式化输出: {{ current_time("%Y-%m-%d") }}</p><p> 传递整数调用函数: {{ add_function(34,12) }}</p>
<p> 传递数组调用函数: {{ list_function([1,2,3,4,5]) }}</p>
后端代码编写部分,需要引入current_app
然后在需要定义的函数上增加@app.context_processor
装饰器,返回参数通过字典调用dict(list_function = get)
得到结果。
from flask import Flask, render_template
from flask import current_app
import timeapp = Flask(__name__)# 自定义变量
@app.context_processor
def appinfo():return dict(app_name = current_app.name,local_time = time.time(),local_user = "lyshark")# 自定义函数
@app.context_processor
def app_function_gettime():def get_time(timeFormat="%b %d, %Y - %H:%M:%S"):return time.strftime(timeFormat)return dict(current_time = get_time)# 自定义函数(传递整数)
@app.context_processor
def app_function_add():def get(x=0,y=0):z = x + yreturn zreturn dict(add_function = get)# 自定义函数(传递数组)
@app.context_processor
def app_function_list():def get(x=[]):sum = 0for item in x:sum = sum + itemreturn sumreturn dict(list_function = get)@app.route("/", methods=["GET", "POST"])
def index():return render_template("index.html")if __name__ == '__main__':app.run(debug=True)
自定义过滤器
自定义过滤器是一种强大的工具,允许开发者在模板中对数据进行各种处理和格式化操作。过滤器其实就是函数,通过使用add_template_filter
方法将自定义函数注册为模板过滤器,从而在模板中调用。
关键点和优势:
- 过滤器的定义: 开发者可以通过定义一个函数,并使用
add_template_filter
方法将这个函数注册为模板过滤器。这个函数将用于对模板中的数据进行处理。 - 数据处理和格式化: 自定义过滤器可以执行各种数据处理和格式化操作,如日期格式化、字符串截断、数据转换等。这有助于在模板中减少逻辑处理,保持模板的简洁性。
- 可重用性: 通过自定义过滤器,开发者可以将常用的数据处理逻辑抽象成函数,提高代码的可重用性。这些过滤器可以在多个模板和视图中共享使用。
- 模板中的使用: 一旦注册了自定义过滤器,就可以在模板中使用它。通过在模板中调用过滤器函数,并传递相应的参数,可以对模板中的数据进行实时处理。
- 框架集成: Flask提供了简单而强大的方式来集成自定义过滤器,使得开发者可以轻松地扩展模板引擎的功能,满足不同场景下的需求。
通过灵活使用自定义过滤器,可以使模板引擎更加强大,满足更复杂的展示需求。这种机制有助于降低模板中的代码复杂度,提高开发效率,同时保持模板的可读性。
过滤器其实是一个函数,函数支持自定义功能,通过flask的add_template_filter
将我们的函数加入到过滤器表单中。
<p>输出双数: {{ [1,2,3,4,5,6,7,8,9,10] | double_step }}</p>
<p>输出子列表: {{ [1,2,3,4,5,6,7,8,9,10] | sub_step(1,5) }}</p>
<p>全局函数调用: {{ global_add(10,20,30) }} </p>
后台增加过滤器有两种方式,直接在函数上增加@app.template_filter('sub_step')
装饰器实现,或通过add_template_filter
将某个函数直接定义为过滤器使用。
from flask import Flask, render_template
from flask import current_appapp = Flask(__name__)@app.route("/", methods=["GET", "POST"])
def index():return render_template("index.html")# 增加过滤器(方式1),输出列表中的双数
def double_step_filter(x):return x[::2]
app.add_template_filter(double_step_filter,"double_step")# 增加过滤器(方式2)
@app.template_filter('sub_step')
def sub(x, start, end):return x[start:end]# 增加全局函数
@app.template_global('global_add')
def function(x,y,z):return x+y+zif __name__ == '__main__':app.run(debug=True)
自定义测试器
自定义测试器是一种用于在模板中进行条件判断的工具。类似于过滤器,自定义测试器也是通过注册函数的方式来实现的,但是它们主要用于在模板中执行布尔条件测试。
关键点和优势:
- 测试器的定义: 开发者可以定义一个函数,并使用
@app.template_test()
装饰器将其注册为模板测试器。这个函数将包含一些布尔条件判断逻辑。 - 条件判断: 自定义测试器主要用于在模板中进行条件判断。通过在模板中调用测试器函数,并传递相应的参数,可以获取布尔值,用于控制模板中的条件分支。
- 可读性和模块化: 将常用的布尔条件判断逻辑抽象成测试器函数,有助于提高模板中的可读性和模块化程度。这使得在模板中的条件判断部分更为清晰和易于维护。
- 模板中的使用: 一旦注册了自定义测试器,就可以在模板中使用它。通过在模板中调用测试器函数,并传递相应的参数,可以获得布尔值,从而决定模板中的条件分支。
- 框架集成: Flask提供了简单而强大的方式来集成自定义测试器,使得开发者可以轻松地扩展模板引擎的功能,实现更灵活的条件判断。
通过合理使用自定义测试器,可以使得模板中的条件判断更为清晰和灵活。这种机制有助于降低模板中的代码复杂度,提高开发效率,同时使得模板的逻辑更易于理解和维护。
自定义测试器与过滤器基本一致,区别在于测试器使用@app.template_test()
装饰函数,其他方法与过滤器保持一致。
<!--验证字符串结尾是否是指定字符-->
{% if name is end_with "me" %}<h2>"字符串 {{ name }}" 结尾是 "me"</h2>
{% else %}<h2>"字符串 {{ name }}" 结尾不是 "me"</h2>
{% endif %}<!--验证数组中是否有大于10的元素-->
{% if lists is array_of "10" %}<h2>列表中存在,大于10的数据</h2>
{% endif %}
测试器后端分别定义两个函数,一个用于判断字符串结尾是否存在某个字符,另一个则是验证数组内是否存在大于元素。
from flask import Flask, render_templateapp = Flask(__name__)# 自定义测试器
@app.template_test('end_with')
def end_with(str,suffix):return str.lower().endswith(suffix.lower())# 自定义测试器(测试数组内是否有大于某值的)
@app.template_test('array_of')
def array_of(str,suffix):for item in str:if item >= int(suffix):return True@app.route("/", methods=["GET", "POST"])
def index():return render_template("index.html",name = "lyshark me", lists = [1,2,3,4,5,6,7,8,56,33])if __name__ == '__main__':app.run(debug=True)
相关文章:
Flask 使用Jinja2模板引擎
Jinja2,由Flask框架的创作者开发,是一款功能丰富的模板引擎,以其完整的Unicode支持、灵活性、高效性和安全性而备受推崇。最初受Django模板引擎启发,Jinja2为Flask提供了强大的模板支持,后来也成为其他项目的首选。在本…...

C/C++内存管理,malloc,realloc,calloc,new,delete详解!!!
1.初步了解内存中各个区间存储的数据特征 1.栈区:存储一些局部变量、函数参数、返回值等,跟函数栈振有关,出了作用域,生命周期结束。 2.堆区:用于动态开辟空间,如果不主动销毁空间,则程序运行结…...

高级JVM
一、Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 首先先了解电脑是二进制的系统,他只认识 01010101比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的HelloWord.java是我们程序员编写的,我们人可以认识,但是电脑不…...

论文阅读——MCAN(cvpr2019)
补充一下MCAN-VQA: 对图片的处理:首先输入图片到Faster R-CNN,会先设定一个判断是否检测到物体的阈值,这样动态的生成m∈[10,100]个目标,然后从检测到的对应的区域通过平均池化提取特征。第i个物体特征表示为ÿ…...

mac电脑文件比较工具 UltraCompare 中文for mac
UltraCompare是一款功能强大的文件和文件夹比较工具,用于比较和合并文本、二进制和文件夹。它提供了丰富的功能和直观的界面,使用户能够轻松地比较和同步文件内容,查找差异并进行合并操作。 以下是UltraCompare软件的一些主要特点和功能&…...
XML Schema 的extension 元素
XML Schema 的extension 元素对complexContent、simpleContent元素进行扩展。 例如,下面通过增加了两个属性,对simpleContent进行了扩展: <xs:element name"condition" maxOccurs"unbounded" minOccurs"0"…...

每日一题2023.11.26——打印沙漏【PTA】
题目要求: 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ************ *****所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;…...

【C++】类和对象——拷贝构造和赋值运算符重载
上一篇我们讲了构造函数,就是对象实例化时会自动调用,那么,我们这里的拷贝构造在形式上是构造函数的一个重载,拷贝构造其实也是一种构造函数,那么我们就可以引出这里的规则 1.拷贝构造函数的函数名必须与类名相同。 2.…...

基于acme免费申请泛域名证书
参考文档:https://github.com/acmesh-official/acme.sh 文章目录 step1: 获取阿里云的ak、skstep2: 安装acmestep3: 安装通配符证书step4: 查看证书step5: 证书的使用step6: 删除证书 step1: 获取阿里云的ak、sk export Ali_Key"LTAI5tG8888888CDoEjLzkE"…...

系列十九、Spring实例化bean的方式
一、概述 所谓实例化bean,大白话讲就是Spring如何把这一个个的普通的Java对象创建为Spring bean的。 二、方式 Spring中实例化bean常用的有以下四种,即: ① 构造器方式; ② 静态工厂方式; ③ 实例工厂方式;…...
WordPress无插件实现css、js加速 实现动静态分离
“Wordpress网站现在普遍较慢”,其实是没有做好优化罢了,像我的网站生成页面的时间才0.06s,而且我这网站还有提速的机会呢,如css、js使用CDN加速,实现动静态分离,我安装过,Memcache和PHP加速脚本就已经让我…...

2017年五一杯数学建模B题自媒体时代的消息传播问题解题全过程文档及程序
2017年五一杯数学建模 B题 自媒体时代的消息传播问题 原题再现 电视剧《人民的名义》中人物侯亮平说:“现在是自媒体时代,任何突发性事件几分钟就传播到全世界。”相对于传统媒体,以互联网技术为基础的自媒体以其信息传播的即时性、交往方式…...

虹科分享 | AR世界揭秘:从二维码的起源到数据识别与位姿技术的奇妙融合!
引言:探索AR的神奇世界,我们将从二维码的诞生谈起。在这个科技的海洋中,二维码是如何帮助AR实现数据获取与位姿识别的呢?让我们一起揭开这层神秘的面纱! 一、二维码的由来 二维码是将数据存储在图形中的技术ÿ…...
基于helm部署并配置StorageClass
此类方法适用于测试环境或者小型的集群环境,因为nfs是网络文件系统,在io性能上并不能有所保证。 前置条件: 已部署k8s集群已安装helm 工具 step1: 安装nfs服务 yum install nfs-utils -ystep2: 配置nfs # 编辑/etc/exports /data/nfs *(r…...

Python基础:字符串详解(需补充完善)
1. 字符串定义 在Python中,字符串是一种数据类型,用于表示文本数据。字符串是由字符组成的序列,可以包含字母、数字、符号和空格等字符。在Python中,你可以使用单引号()或双引号("&#x…...
做直播服务器要什么样的配置呢?
现在直播行业越来越火爆,大大小小的平台或者企业都选择通过直播卖货的方式出售产品,直播的内容还有观看直播的人数等等都影响了服务器的配置需求,今天小编就给大家讲一讲吧! 1、内存:直播服务器需要足够的内存才能支持…...

⑥【bitmap 】Redis数据类型: bitmap [使用手册]
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Redis bitmap ⑥Redis bitmap 基本操作命令1. …...
CentOS升级GCC
背景 CentOS 7默认自带GCC版本4.8,而目前工作中开发环境需要用到GCC8和GCC12,这里记录一下如何升级GCC版本,以及如何多版本并存。参考: CentOS升级gcc-知乎 Redhat7上安装Red Hat Developer Toolset并自由切换gcc和g的版本 Cent…...

CodeWhisperer 体验总结
CodeWhisperer 体验总结 | CodeWhisperer 是一款亚马逊新推出的通用代码生成器 可以实时进行代码数据的提供 还可以定义安全问题 CodeWhisperer 对个人用户是免费使用 企业用户需要订阅使用 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例…...
Apache换行解析漏洞(CVE-2017-15715)
漏洞简介 Apache換行解析漏洞(CVE-2017-15715)是一种解析漏洞,可以影响httpd 2.4.0至2.4.29版本中的PHP解析。攻击者可以通过在上传的文件名中添加特定的换行符,绕过服务器的安全策略,使其被解析成PHP文件而不是普通文件。此漏洞会影响具有以下条件的服务器: 未正确配置…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
LeetCode 0386.字典序排数:细心总结条件
【LetMeFly】386.字典序排数:细心总结条件 力扣题目链接:https://leetcode.cn/problems/lexicographical-numbers/ 给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。…...

Unity VR/MR开发-开发环境准备
视频讲解链接: 【XR马斯维】UnityVR/MR开发环境准备【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...