Flask 快速入门
1. Flask 简介
1.1 什么是 Flask
Flask 是一个用 Python 编写的轻量级 Web 框架,被誉为 微框架。它提供基础功能,如路由、请求处理和模板引擎,但不强迫开发者使用特定库或工具,赋予开发人员高度的自由选择权,以满足不同项目的需求。
简单来说,Flask 帮助 Python 开发者快速构建 Web 应用,提供以下核心功能:
- 路由: 将 URL 与对应的 Python 函数进行匹配,实现 URL 到函数的映射。
- 请求处理: 处理来自用户的 HTTP 请求,例如获取请求参数、解析请求数据等,并将处理结果返回给用户。
- 模板引擎: 使用 Jinja2 模板引擎动态渲染网页,将数据嵌入到 HTML 模板中,生成最终的 HTML 页面。
1.2 Flask 的优势
- 轻量级和灵活: Flask 没有强迫性要求,允许开发者自由选择数据库、模板引擎和其他库,完全掌控项目的架构和组件选择。
- 易于学习: Flask 的语法简洁直观,易于理解和掌握,即使是初学者也能快速上手。
- 强大的社区支持: Flask 拥有庞大而活跃的社区,开发者可以轻松获取各种资源、教程、示例代码和帮助,解决开发中的问题。
- 可扩展性: Flask 提供扩展机制,允许开发者通过添加扩展来扩展功能,例如数据库集成、用户认证、表单验证、邮件发送等,满足不同项目的需求。
1.3 Flask 的应用场景
Flask 适合以下应用场景:
- 小型项目: 对于简单的网站或 API,Flask 提供快速开发和部署方案,节省时间和成本。
- 原型开发: Flask 帮助开发者快速构建原型,验证想法的可行性,并进行快速迭代和修改。
- 个性化需求: Flask 的灵活性满足定制化的 API、特定领域应用等需求,可以根据项目的特殊要求进行灵活调整和扩展。
一些使用 Flask 的知名应用:
- Pinterest: 一家图片社交网站,使用 Flask 构建了其核心功能。
- Lyft: 一家打车服务公司,使用 Flask 构建了其 API 和 Web 应用。
- Twilio: 一家云通信平台,使用 Flask 构建了其 API 和管理界面。
1.4 Flask 的基本架构
Flask 的基本架构包括以下几个关键部分:
- WSGI 应用: Flask 应用本身是一个 WSGI 应用,负责接收 HTTP 请求并生成响应。
- 路由: 使用
@app.route
装饰器将 URL 与 Python 函数进行绑定,实现 URL 到函数的映射。 - 请求处理: Flask 提供
request
对象,用于获取 HTTP 请求信息,例如请求方法、请求参数、请求头等。 - 模板引擎: Flask 默认使用 Jinja2 模板引擎,用于渲染动态网页。
- 响应生成: Flask 使用
render_template
函数渲染模板,或使用make_response
函数创建响应对象,并返回给用户。
了解这些基本架构有助于理解 Flask 的工作原理,以及如何使用 Flask 构建 Web 应用。
2. 快速上手
2.1 安装 Flask
使用 pip 安装 Flask:
pip install Flask
2.2 创建第一个 Flask 应用
创建名为 app.py
的文件,并添加以下代码:
from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'Hello, Flask!'if __name__ == '__main__':app.run(debug=True)
代码解释:
from flask import Flask
: 导入 Flask 库。app = Flask(__name__)
: 创建一个 Flask 应用实例,__name__
表示当前模块名,用于指定应用的根目录。@app.route('/')
: 定义一个路由,将根路径/
与index
函数关联。def index():
: 定义一个函数,返回一个字符串 “Hello, Flask!”。if __name__ == '__main__':
: 确保代码只在直接运行脚本时执行,而不是被其他模块导入时执行。app.run(debug=True)
: 运行 Flask 应用,开启调试模式。
2.3 运行 Flask 应用
在终端中运行以下命令:
python app.py
打开浏览器,访问 http://127.0.0.1:5000/
,你将看到 “Hello, Flask!” 的输出。
2.4 使用路由
路由用于将 URL 与 Python 函数进行匹配。在上面的代码中,@app.route('/')
定义了一个路由,将根路径 /
与 index
函数关联。
你可以定义多个路由,例如:
@app.route('/about')
def about():return 'This is the about page.'@app.route('/contact')
def contact():return 'This is the contact page.'
访问 http://127.0.0.1:5000/about
和 http://127.0.0.1:5000/contact
将分别显示 “This is the about page.” 和 “This is the contact page.”。
2.5 处理 HTTP 请求方法
Flask 可以区分不同的 HTTP 请求方法,例如 GET
、POST
、PUT
、DELETE
等。
可以使用 methods
参数来指定允许的 HTTP 请求方法:
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'GET':return 'Login page'elif request.method == 'POST':# 处理 POST 请求return 'Login successful'
代码解释:
methods=['GET', 'POST']
: 允许使用GET
和POST
请求方法访问/login
路由。request.method
: 获取当前请求方法。
访问 http://127.0.0.1:5000/login
将显示 “Login page”,使用 POST 请求则会显示 “Login successful”。
3. 模板渲染
模板渲染是将数据动态插入到 HTML 页面中,生成最终的 HTML 内容,Flask 使用 Jinja2 模板引擎来实现模板渲染。
3.1 Jinja2 模板引擎
Jinja2 是一个功能强大的模板引擎,它提供了一套语法来定义模板,并支持变量、循环、条件语句等功能。
3.2 使用模板渲染页面
-
创建模板文件
在应用的根目录下创建
templates
目录,并将模板文件放在该目录下。例如,创建一个名为index.html
的模板文件:<!DOCTYPE html> <html> <head><title>My Flask App</title> </head> <body><h1>Hello, {{ name }}!</h1> </body> </html>
-
使用
render_template()
函数渲染模板在视图函数中使用
render_template()
函数渲染模板,并将数据传递到模板中。from flask import Flask, render_templateapp = Flask(__name__)@app.route('/') def index():name = 'World'return render_template('index.html', name=name)if __name__ == '__main__':app.run(debug=True)
这段代码将
index.html
模板渲染,并传递name
变量的值到模板中,最终生成的 HTML 内容为:<!DOCTYPE html> <html> <head><title>My Flask App</title> </head> <body><h1>Hello, World!</h1> </body> </html>
3.3 传递数据到模板
在 render_template()
函数中,可以使用关键字参数将数据传递到模板中。
传递单个变量:
return render_template('index.html', name='World')
传递多个变量:
return render_template('index.html', name='World', age=25)
传递列表:
names = ['Alice', 'Bob', 'Charlie']
return render_template('index.html', names=names)
传递字典:
user = {'name': 'Alice', 'age': 25}return render_template('index.html', user=user)
3.4 模板继承
Jinja2 支持模板继承,允许你定义一个基础模板,并在其他模板中继承该基础模板。
基础模板 (base.html
):
<!DOCTYPE html>
<html>
<head><title>{% block title %}My Flask App{% endblock %}</title>
</head>
<body><header><h1>Welcome to My Flask App</h1></header><main>{% block content %}{% endblock %}</main><footer><p>© 2023 My Flask App</p></footer>
</body>
</html>
继承模板 (index.html
):
{% extends 'base.html' %}{% block title %}Home{% endblock %}{% block content %}
<h2>Hello, {{ name }}!</h2>
{% endblock %}
在继承模板中,可以使用 {% block %}
标签定义可覆盖的区域,并使用 {% extends %}
标签继承基础模板。
3.5 模板中的控制语句
Jinja2 支持在模板中使用控制语句,例如循环和条件语句。
循环语句:
<ul>{% for name in names %}<li>{{ name }}</li>{% endfor %}
</ul>
条件语句:
{% if user.is_authenticated %}<p>Welcome, {{ user.name }}!</p>
{% else %}<p>Please log in.</p>
{% endif %}
4. 数据库集成
Flask 通过集成 SQLAlchemy 等数据库 ORM 库,实现与数据库的交互。
4.1 安装 SQLAlchemy
使用 pip 安装 Flask-SQLAlchemy 扩展:
pip install Flask-SQLAlchemy
4.2 配置数据库
在应用的配置中添加数据库连接字符串,例如使用 SQLite 数据库:
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
4.3 定义模型
使用 SQLAlchemy 定义数据库模型,例如用户模型:
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)def __repr__(self):return f'<User {self.username}>'
代码解释:
db = SQLAlchemy(app)
: 创建一个 SQLAlchemy 实例,并绑定到 Flask 应用。class User(db.Model)
: 定义一个用户模型,继承自db.Model
。id = db.Column(db.Integer, primary_key=True)
: 定义id
列,作为主键。username = db.Column(db.String(80), unique=True, nullable=False)
: 定义username
列,字符串类型,必须唯一且非空。email = db.Column(db.String(120), unique=True, nullable=False)
: 定义email
列,字符串类型,必须唯一且非空。
4.4 创建数据库
在交互式 Python 解释器中运行以下命令,创建数据库和表:
>>> from app import db
>>> db.create_all()
4.5 操作数据库
插入数据:
user = User(username='Alice', email='alice@example.com')
db.session.add(user)
db.session.commit()
查询数据:
users = User.query.all()
print(users)
更新数据:
user = User.query.filter_by(username='Alice').first()
user.email = 'alice@newdomain.com'
db.session.commit()
删除数据:
user = User.query.filter_by(username='Alice').first()
db.session.delete(user)
db.session.commit()
4.6 处理数据库关系
SQLAlchemy 支持处理一对多、多对多等复杂关系,例如定义一对多关系:
父模型:
class Author(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50), nullable=False)books = db.relationship('Book', backref='author', lazy=True)
子模型:
class Book(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)author_id = db.Column(db.Integer, db.ForeignKey('author.id'), nullable=False)
代码解释:
db.relationship('Book', backref='author', lazy=True)
: 在Author
模型中定义一个关系属性books
,表示与Book
模型的一对多关系。db.ForeignKey('author.id')
: 在Book
模型中定义外键author_id
,指向Author
模型的id
列。
5. 表单处理
Flask-WTF 是一个集成 WTForms 的 Flask 扩展,用于处理表单创建、验证和错误处理。
5.1 安装 Flask-WTF
使用 pip 安装 Flask-WTF 扩展:
pip install Flask-WTF
5.2 配置 Flask-WTF
在应用的配置中添加 CSRF 保护的密钥:
app.config['SECRET_KEY'] = 'your_secret_key'
5.3 定义表单
使用 Flask-WTF 定义一个登录表单:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequiredclass LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired()])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')
代码解释:
FlaskForm
: 表单基类。StringField
: 文本输入框。PasswordField
: 密码输入框。SubmitField
: 提交按钮。DataRequired
: 验证器,确保字段不为空。
5.4 渲染表单
在视图函数中创建表单实例,并在模板中渲染表单。
视图函数:
@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():# 处理登录逻辑return 'Login successful'return render_template('login.html', form=form)
模板文件 (login.html
):
<!DOCTYPE html>
<html>
<head><title>Login</title>
</head>
<body><form method="POST">{{ form.hidden_tag() }}<p>{{ form.username.label }}<br>{{ form.username(size=32) }}<br>{% for error in form.username.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</p><p>{{ form.password.label }}<br>{{ form.password(size=32) }}<br>{% for error in form.password.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</p><p>{{ form.submit() }}</p></form>
</body>
</html>
代码解释:
form.validate_on_submit()
: 检查表单是否通过验证。{{ form.hidden_tag() }}
: 渲染 CSRF 保护的隐藏标签。{{ form.username.label }}
: 渲染表单字段的标签。{{ form.username(size=32) }}
: 渲染表单字段的输入框。{% for error in form.username.errors %}
: 渲染验证错误信息。
5.5 表单验证
在表单定义中添加验证器,例如 Email
验证器:
from wtforms.validators import Emailclass LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), Email()])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')
代码解释:
Email()
: 验证器,确保字段是有效的电子邮件地址。
5.6 自定义验证器
可以定义自定义验证器,并在表单定义中使用:
from wtforms.validators import ValidationErrordef custom_validator(form, field):if field.data != 'expected_value':raise ValidationError('Invalid value')class LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), custom_validator])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')
代码解释:
custom_validator(form, field)
: 自定义验证器函数,检查字段值是否为预期值。raise ValidationError('Invalid value')
: 抛出验证错误。
6. 用户认证
Flask-Login 是一个用户会话管理扩展,用于处理用户登录、注销和会话管理。
6.1 安装 Flask-Login
使用 pip 安装 Flask-Login 扩展:
pip install Flask-Login
6.2 配置 Flask-Login
在应用中初始化 Flask-Login,并定义用户加载函数:
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_userlogin_manager = LoginManager(app)
login_manager.login_view = 'login'@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id))
代码解释:
LoginManager(app)
: 创建一个 LoginManager 实例,并绑定到 Flask 应用。login_manager.login_view = 'login'
: 设置登录视图的端点。@login_manager.user_loader
: 定义用户加载函数,根据用户 ID 加载用户对象。
6.3 定义用户模型
用户模型需要继承 UserMixin
,并实现用户加载函数:
class User(UserMixin, db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)password = db.Column(db.String(128), nullable=False)def __repr__(self):return f'<User {self.username}>'
代码解释:
UserMixin
: 提供用户会话管理所需的方法和属性。
6.4 用户登录
在视图函数中处理用户登录:
@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():user = User.query.filter_by(username=form.username.data).first()if user and user.password == form.password.data:login_user(user)return 'Login successful'return render_template('login.html', form=form)
代码解释:
User.query.filter_by(username=form.username.data).first()
: 根据用户名查询用户。login_user(user)
: 登录用户,创建用户会话。
6.5 保护视图
使用 @login_required
装饰器保护需要登录访问的视图:
@app.route('/dashboard')
@login_required
def dashboard():return f'Welcome, {current_user.username}!'
代码解释:
@login_required
: 确保只有登录用户才能访问该视图。current_user
: 获取当前登录的用户对象。
6.6 用户注销
在视图函数中处理用户注销:
@app.route('/logout')
@login_required
def logout():logout_user()return 'You have been logged out.'
代码解释:
logout_user()
: 注销用户,结束用户会话。
相关文章:
Flask 快速入门
1. Flask 简介 1.1 什么是 Flask Flask 是一个用 Python 编写的轻量级 Web 框架,被誉为 微框架。它提供基础功能,如路由、请求处理和模板引擎,但不强迫开发者使用特定库或工具,赋予开发人员高度的自由选择权,以满足不…...
性能测试03|JMeter:断言、关联、web脚本录制
目录 一、断言 1、响应断言 2、json断言 3、持续时间断言 二、关联 1、正则表达式介绍 2、正则表达式提取器 3、Xpath提取器 4、JSON提取器 5、JMeter属性 三、web脚本录制 一、断言 定义:让程序自动判断实际的返回结果是否与预期结果保持一致 自动校验…...
微信小程序调用 WebAssembly 烹饪指南
我们都是在夜里崩溃过的俗人,所幸终会天亮。明天就是新的开始,我们会变得与昨天不同。 一、Rust 导出 wasm 参考 wasm-bindgen 官方指南 https://wasm.rust-lang.net.cn/wasm-bindgen/introduction.html wasm-bindgen,这是一个 Rust 库和 CLI…...
java_配置使用nacos完整示例
参考:49 尚上优选项目-平台管理端-整合ESMQ实现商品上下架-流程分析_哔哩哔哩_bilibili 1. 下载安装nacos https://github.com/alibaba/nacos/releases 2. 解压,运行 PS D:\path/to\nacos-server-2.4.3\nacos\bin> .\startup.cmd -m standalone 3.…...
Go语言性能优化-字符串格式化优化
在 Go 语言中,格式化字符串(例如使用 fmt.Sprintf、fmt.Printf 等函数)确实可能对性能产生影响,尤其是当频繁执行格式化操作时。格式化字符串涉及对格式符的解析和数据类型的转换,这会增加额外的开销。为了减少格式化字符串带来的性能影响,可以采取以下一些优化策略: 1…...
Spring源码分析之事件机制——观察者模式(二)
目录 获取监听器的入口方法 实际检索监听器的核心方法 监听器类型检查方法 监听器的注册过程 监听器的存储结构 过程总结 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二ÿ…...
机器学习和深度学习
机器学习(Machine Learning,简称 ML)和深度学习(Deep Learning,简称 DL)都是人工智能(AI)领域的重要技术,它们的目标是使计算机通过数据学习和自主改进,从而完…...
MetaGPT - 多Agent框架
文章目录 一、关于 MetaGPT功能介绍快速开始的演示视频教程 二、安装Pip安装Docker安装 一、关于 MetaGPT MetaGPT 为GPTs分配不同的角色,以形成一个协作实体来完成复杂的任务。 github : https://github.com/geekan/MetaGPTtwitter : https://twitter.com/MetaGP…...
Hyperbolic dynamics
http://www.scholarpedia.org/article/Hyperbolic_dynamics#:~:textAmong%20smooth%20dynamical%20systems%2C%20hyperbolic%20dynamics%20is%20characterized,semilocal%20or%20even%20global%20information%20about%20the%20dynamics. 什么是双曲动力系统? A hy…...
TIM的输入捕获
IC(Input Capture)输入捕获 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中 我们使用测周法测频率 void IC_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphCl…...
SCAU期末笔记 - 数据库系统概念往年试卷解析
数据库搞得人一头雾水,题型太多太杂,已经准备摆烂了。就刷刷往年试卷,挂不挂听天由命。 2019年 Question 1 选择题 1. R ∩ S R∩S R∩S等于一下哪个选项? 画个文氏图秒了 所以选A. R ∩ S R − ( R − S ) R∩SR-(R-S) R∩…...
黑马跟学.苍穹外卖.Day01
黑马跟学.苍穹外卖.Day01 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库…...
获取系统启动时间
获取系统启动时间 uptime命令 gbgb:~$ uptime09:29:41 up 2:21, 4 users, load average: 0.00, 0.00, 0.00 gbgb:~$ 这里的up 13 min表示系统已经运行了2个小时13分钟。 date 命令 /proc/uptime gbgb:~$ date -d "$(awk -F. {print $1} /proc/uptime) second ago&…...
Istio 补充 Kubernetes 的不足
1 Istio 补充 Kubernetes 的不足 Kubernetes 强大但无法解决复杂分布式系统中的非功能性需求,如流量路由、协议转换、请求重试和负载均衡。Istio作为Service Mesh,通过独立的代理进程处理这些需求,避免直接修改业务代码。 2. 独立的代理进程…...
以图像识别为例,关于卷积神经网络(CNN)的直观解释
大家读完觉得有意义记得关注和点赞!!! 作者以图像识别为例,用图文而非数学公式的方式解释了卷积神经网络的工作原理, 适合初学者和外行扫盲。 目录 1 卷积神经网络(CNN) 1.1 应用场景 1.2 起…...
使用PyTorch实现基于稀疏编码的生成对抗网络(GAN)在CIFAR-10数据集上的应用
使用PyTorch实现基于稀疏编码的生成对抗网络(GAN)在CIFAR-10数据集上的应用 目录 使用PyTorch实现基于稀疏编码的生成对抗网络(GAN)在CIFAR-10数据集上的应用1. 引言2. 数据集介绍3. 模型网络结构3.1 网络结构3.2 编码器3.3 生成器3.4 判别器4. 模型优化器与损失函数4.1 优…...
Java重要面试名词整理(十八):Sentinel
文章目录 服务雪崩及其解决方案技术选型: Sentinel or Hystrix 流量治理组件Sentinel**基于SentinelResource注解埋点实现资源保护** Sentinel控制台**限流阈值类型****流控模式****直接****关联** **流控效果**系统规则——系统自适应保护 限流算法**计数器法****滑动时间窗口…...
【微信小程序获取用户手机号
微信小程序获取用户手机号有2种,一种是前端自己解密,一种是获取后发给后端,后端去解密 重点:要在微信公众平台设置里面绑定微信开放平台账号,不然反解不出来用户手机号上代码: <button style"font-size: 16px;" open-type"getPhoneNumber" getphonenumb…...
Profinet转EtherNet/IP网关连接AB PLC的应用案例
某大型制造企业的生产车间同时采用了西门子 S7 - 1500 PLC 作为核心控制系统的一部分,负责主要生产流程的控制与数据处理;而在特定生产环节,由于历史设备遗留或工艺配套需求,存在使用 AB PLC 的情况。这就导致了在整个自动化生产系…...
Maven的依赖管理
1. 依赖管理 依赖管理,可以将有关依赖项的所有信息放在共同的POM中,并对子POM中的工件进行更简单的引用。举个例子: 父POM <project>......<dependencyManagement><dependencies><dependency><groupId>gro…...
验证码识别插件 - captcha-killer
验证码识别插件 - captcha-killer 简介 captcha-killer 是一款用于 Burpsuite 的验证码识别插件。它的主要功能是调用各种验证码识别接口,以便在进行渗透测试时能够自动识别和绕过验证码。这个插件本身并不直接进行验证码的识别,而是通过调用外部的 OC…...
面试题解,Java中的“对象”剖析
一、说一说JVM中对象的内存布局?new一个对象到底占多大内存? 话不多说,看下图,对象的内存布局图 一个对象的内存布局主要由三部分组成:对象头(Object Header)、实例数据(Instance D…...
对计网大题的一些指正(中间介绍一下CDM的原理和应用)
目录 前言: (1)五层原理体系结构每层功能: 下面是文档的答案: 我在之前的博客里面有介绍过五层原理体系结构, 按理来说,第五层应该是应用层才对,而会话层的功能应该被放到应用层…...
122. 买卖股票的最佳时机 II
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150问题分析: 和买卖股票的最佳时机I这题相比,区别就是可以买多只股票虽然同时只能持有一支,但是我们还是可以…...
qt中如何判断字符串是否为数字,整数,浮点数?
在 Qt 中,可以使用多种方法来判断字符串是否为数字、整数或浮点数。Qt 提供了一些方便的字符串和数值处理函数,可以帮助你实现这些判断。以下是几种常见的方法: 1. 使用 QRegularExpression Qt 提供了 QRegularExpression 类,可…...
《GICv3_Software_Overview_Official_Release_B》学习笔记
1.不同版本的 GIC 架构及其主要功能如下图所示: 2.GICv2m(Generic Interrupt Controller Virtualization Model)是针对ARM架构的GIC(通用中断控制器)的一种扩展, GICv2m扩展为虚拟化环境中的中断管理提供了…...
告别Kibana:Elasticsearch 桌面客户端的新变革
告别Kibana:Elasticsearch 桌面客户端的新变革 在大数据处理与分析领域,Elasticsearch 及其相关技术的应用日益广泛。长期以来,Kibana 在数据可视化与查询管理方面占据重要地位,但随着技术的不断发展,用户对于更高效、…...
【蓝桥杯研究生组】第14届Java试题答案整理
试题链接:链接 A题 满足条件的答案有:35813116 public class TianShu {public static void main(String[] args) {int ans 0;// 2000.1.1 - 2000000.1.1// 年份是月份的倍数,也是日的倍数for (int year2000; year<2000000; year) {for …...
链式调用方式重写父类set方法导致fastjson解析的对象属性未赋值
反序列化后发现属性为null 昨天使用fastjson的JSON.parseArray(json, class)反序列化的时候,发现返回的list列表中的对象某个属性为null,但是json字符串里面这个属性是有值的,经过排查发现是因为子类重写了父类的set方法,且返回值…...
[AUTOSAR 基础入门] - AUTOSAR配置工具
返回总目录 前文我们提到了要借助 EasySAR 平台来助力大家更好地融合 AUTOSAR 的理论与实践,让大家能够切实将所学知识转化为实际操作能力。建议大家感兴趣的去注册一下看看。跳转链接:EasySAR EasySAR是昂辉科技基于 AUTOSAR 方法论设计的一款面向汽车…...
鸿蒙开发:实现键值数据库存储
前言 鸿蒙当中数据持久化存储,为我们提供了多种的实现方式,比如用户首选项方式,关系型数据库方式,键值型数据库方式,文件存储方式等等,对于数据量比较的小的,我们直接选择轻量级的用户首选项方式…...
ip属地的信息准确吗?ip归属地不准确怎么办
在数字化时代,IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上,IP属地信息都扮演着重要的角色。然而,随着技术的不断进步和网络的复杂性增加,IP属地信息的准确性问题也日益凸显。那么,IP属地信…...
CSS——1.优缺点
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" type"text/css" href"1-02.css"/></head><body><!--css:层叠样式表…...
Android设备使用AOA协议进行主机与配件模式通信
1.使用TYPC-C数据线连接两台华为手机: TYPE-C线,先连接下图右边的ACCESSORY 再连接左边的HOST 此时左边的HOST(白色) 会给右边的ACCESSORY(黑色) 充电 接着打开左连接的HostChart会自动调起授权,然后会启动右边的AccessoryChart USB HOS…...
MySQL中深度分页问题的优化
MySQL中深度分页问题的优化 在MySQL中,使用LIMIT子句进行分页查询时,可能会遇到一个常见的性能问题:当LIMIT子句中的偏移量X很大时,查询速度会显著下降。例如,LIMIT 0,10可能只需要20毫秒,而LIMIT 1000000,…...
5. C语言 常量与宏定义
本章目录: 前言一、什么是常量?1. 整型常量2. 浮点型常量3. 字符常量4. 字符串常量 二、如何定义常量?1. 使用 #define 宏定义2. 使用 const 关键字 三、#define 和 const 的区别四、使用建议1. 使用场景区分2. 避免宏定义的潜在问题 五、特殊用法与小技…...
【mybatis-plus问题集锦系列】mybatis使用xml配置文件实现数据的基础增删改查
简单的数据查询,我们可以在mapper接口里面去实现,但是如果是复杂的查询,我们就可以使用xml配置文件去做, 官网链接xml配置文件 实现效果 实现代码 根据mapper接口的包结构,在resources包里面新建同名同结构的xml文件…...
spring防止重复点击,两种注解实现(AOP)
第一种:EasyLock 简介 为了简化可复用注解,自己实现的注解,代码简单随拿随用 使用方式 1.创建一个注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface EasyLock {long waitTime() default …...
Spring Boot 3 实现 MySQL 主从数据库之间的数据同步
✅ Spring Boot 3 实现 MySQL 主从数据库之间的数据同步 在实际项目中,为了提高 系统的读性能 和 数据的可用性,通常会使用 主从数据库架构。Spring Boot 提供了对 多数据源 的良好支持,可以轻松配置 主从数据库 的数据同步,实现 读写分离。 🎯 方案介绍 我们将通过 Sp…...
WPS-JS宏快速上手
WPS JS宏注意事项 代码后面可以不写分号“ ; ”; 缩进对程序的运行影响不大,但为了易读(防止自己以后看不懂),还是乖乖写好; 代码是逐行运行的,意味着下面一行代码错了,前面的代码…...
力扣hot100——堆
215. 数组中的第K个最大元素 快速排序 class Solution { public:int findKthLargest(vector<int>& a, int k) {auto qsort [&](this auto&& qsort, int l, int r) -> void {if (l r) return;int i l - 1, j r 1;int x a[(l r) / 2];/*如果把…...
【小制作】米家模拟手指点击
代码功能解释 这段代码是一个基于Arduino平台的控制程序,主要功能包括: 初始化:设置引脚模式、初始化编码器、舵机和EEPROM。按键检测:处理按钮的单击、双击和长按事件,并根据事件执行相应操作。编码器更新ÿ…...
ubuntu1604 apt镜像源切换
1、如何查看当前源 cat /etc/apt/sources.list less /etc/apt/sources.list 2、apt源修改为阿里镜像,这里ubuntu是1604: deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/…...
leetcode刷题笔记
题目思路1.两数之和哈希表2.两数相加链表操作3. 无重复字符的最长子串滑动窗口,特别注意数组越界情况!4. 寻找两个正序数组的中位数5.最长回文子串从中间向两边扩展,注意整个字符串都是回文串的边界情况10.正则表达式匹配动态规划,…...
修复 ITunes 在 Windows 或 Mac 上不断崩溃的问题 [100% 有效]
对于 iDevice 用户来说,只能通过 iTunes 在 iDevice 和计算机之间传输文件的困境一直是一个紧迫的问题。所有 iPhone 用户可能都知道,iTunes 并不是一款高效的应用程序,有时性能会很差,例如在 iDevices 和计算机之间传输文件时不断…...
Mac M2基于MySQL 8.4.3搭建(伪)主从集群
前置准备工作 安装MySQL 8.4.3 参考博主之前的文档,在本地Mac安装好MySQL:Mac M2 Pro安装MySQL 8.4.3安装目录:/usr/local/mysql,安装好的MySQL都处于运行状态,需要先停止MySQL服务最快的方式:系统设置 …...
Visual Point Cloud Forecasting enables Scalable Autonomous Driving——点云论文阅读(12)
此内容是论文总结,重点看思路!! 文章概述 这篇文章介绍了一个名为 ViDAR 的视觉点云预测框架,它通过预测历史视觉输入生成未来点云,作为自动驾驶的预训练任务。ViDAR 集成了语义、三维几何和时间动态信息,有效提升了感知、预测和规划等自动驾驶核心任务的性能。实验表明…...
handpose x plus 数据解析 >> DataBall
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” ---------------------------- 样品数据: 通过加入知识…...
LINUX线程操作
文章目录 线程的定义LINUX中的线程模型一对一模型多对一模型多对多模型 线程实现原理线程的状态新建状态(New)就绪状态(Runnable)运行状态(Running)阻塞状态(Blocked)死亡状态&#…...
每日一学——日志管理工具(ELK Stack)
5.1 ELK Stack 5.1.1 Elasticsearch索引机制 嘿,小伙伴们!今天我们要聊聊ELK Stack——一套由Elasticsearch、Logstash和Kibana组成的强大日志管理工具集。通过这套工具,我们可以轻松地收集、存储、搜索和可视化日志数据。首先,…...