当前位置: 首页 > news >正文

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 的基本架构包括以下几个关键部分:

  1. WSGI 应用: Flask 应用本身是一个 WSGI 应用,负责接收 HTTP 请求并生成响应。
  2. 路由: 使用 @app.route 装饰器将 URL 与 Python 函数进行绑定,实现 URL 到函数的映射。
  3. 请求处理: Flask 提供 request 对象,用于获取 HTTP 请求信息,例如请求方法、请求参数、请求头等。
  4. 模板引擎: Flask 默认使用 Jinja2 模板引擎,用于渲染动态网页。
  5. 响应生成: 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/abouthttp://127.0.0.1:5000/contact 将分别显示 “This is the about page.” 和 “This is the contact page.”。

2.5 处理 HTTP 请求方法

Flask 可以区分不同的 HTTP 请求方法,例如 GETPOSTPUTDELETE 等。

可以使用 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']: 允许使用 GETPOST 请求方法访问 /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 使用模板渲染页面

  1. 创建模板文件

    在应用的根目录下创建 templates 目录,并将模板文件放在该目录下。例如,创建一个名为 index.html 的模板文件:

    <!DOCTYPE html>
    <html>
    <head><title>My Flask App</title>
    </head>
    <body><h1>Hello, {{ name }}!</h1>
    </body>
    </html>
    
  2. 使用 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>&copy; 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 框架&#xff0c;被誉为 微框架。它提供基础功能&#xff0c;如路由、请求处理和模板引擎&#xff0c;但不强迫开发者使用特定库或工具&#xff0c;赋予开发人员高度的自由选择权&#xff0c;以满足不…...

性能测试03|JMeter:断言、关联、web脚本录制

目录 一、断言 1、响应断言 2、json断言 3、持续时间断言 二、关联 1、正则表达式介绍 2、正则表达式提取器 3、Xpath提取器 4、JSON提取器 5、JMeter属性 三、web脚本录制 一、断言 定义&#xff1a;让程序自动判断实际的返回结果是否与预期结果保持一致 自动校验…...

微信小程序调用 WebAssembly 烹饪指南

我们都是在夜里崩溃过的俗人&#xff0c;所幸终会天亮。明天就是新的开始&#xff0c;我们会变得与昨天不同。 一、Rust 导出 wasm 参考 wasm-bindgen 官方指南 https://wasm.rust-lang.net.cn/wasm-bindgen/introduction.html wasm-bindgen&#xff0c;这是一个 Rust 库和 CLI…...

java_配置使用nacos完整示例

参考&#xff1a;49 尚上优选项目-平台管理端-整合ESMQ实现商品上下架-流程分析_哔哩哔哩_bilibili 1. 下载安装nacos https://github.com/alibaba/nacos/releases 2. 解压&#xff0c;运行 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源码分析之事件机制——观察者模式&#xff08;一&#xff09;-CSDN博客 Spring源码分析之事件机制——观察者模式&#xff08;二&#xff…...

机器学习和深度学习

机器学习&#xff08;Machine Learning&#xff0c;简称 ML&#xff09;和深度学习&#xff08;Deep Learning&#xff0c;简称 DL&#xff09;都是人工智能&#xff08;AI&#xff09;领域的重要技术&#xff0c;它们的目标是使计算机通过数据学习和自主改进&#xff0c;从而完…...

MetaGPT - 多Agent框架

文章目录 一、关于 MetaGPT功能介绍快速开始的演示视频教程 二、安装Pip安装Docker安装 一、关于 MetaGPT MetaGPT 为GPTs分配不同的角色&#xff0c;以形成一个协作实体来完成复杂的任务。 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. 什么是双曲动力系统&#xff1f; A hy…...

TIM的输入捕获

IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中 我们使用测周法测频率 void IC_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphCl…...

SCAU期末笔记 - 数据库系统概念往年试卷解析

数据库搞得人一头雾水&#xff0c;题型太多太杂&#xff0c;已经准备摆烂了。就刷刷往年试卷&#xff0c;挂不挂听天由命。 2019年 Question 1 选择题 1. R ∩ S R∩S R∩S等于一下哪个选项&#xff1f; 画个文氏图秒了 所以选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 强大但无法解决复杂分布式系统中的非功能性需求&#xff0c;如流量路由、协议转换、请求重试和负载均衡。Istio作为Service Mesh&#xff0c;通过独立的代理进程处理这些需求&#xff0c;避免直接修改业务代码。 2. 独立的代理进程…...

以图像识别为例,关于卷积神经网络(CNN)的直观解释

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 作者以图像识别为例&#xff0c;用图文而非数学公式的方式解释了卷积神经网络的工作原理&#xff0c; 适合初学者和外行扫盲。 目录 1 卷积神经网络&#xff08;CNN&#xff09; 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 作为核心控制系统的一部分&#xff0c;负责主要生产流程的控制与数据处理&#xff1b;而在特定生产环节&#xff0c;由于历史设备遗留或工艺配套需求&#xff0c;存在使用 AB PLC 的情况。这就导致了在整个自动化生产系…...

Maven的依赖管理

1. 依赖管理 依赖管理&#xff0c;可以将有关依赖项的所有信息放在共同的POM中&#xff0c;并对子POM中的工件进行更简单的引用。举个例子&#xff1a; 父POM <project>......<dependencyManagement><dependencies><dependency><groupId>gro…...

验证码识别插件 - captcha-killer

验证码识别插件 - captcha-killer 简介 captcha-killer 是一款用于 Burpsuite 的验证码识别插件。它的主要功能是调用各种验证码识别接口&#xff0c;以便在进行渗透测试时能够自动识别和绕过验证码。这个插件本身并不直接进行验证码的识别&#xff0c;而是通过调用外部的 OC…...

面试题解,Java中的“对象”剖析

一、说一说JVM中对象的内存布局&#xff1f;new一个对象到底占多大内存&#xff1f; 话不多说&#xff0c;看下图&#xff0c;对象的内存布局图 一个对象的内存布局主要由三部分组成&#xff1a;对象头&#xff08;Object Header&#xff09;、实例数据&#xff08;Instance D…...

对计网大题的一些指正(中间介绍一下CDM的原理和应用)

目录 前言&#xff1a; &#xff08;1&#xff09;五层原理体系结构每层功能&#xff1a; 下面是文档的答案&#xff1a; 我在之前的博客里面有介绍过五层原理体系结构&#xff0c; 按理来说&#xff0c;第五层应该是应用层才对&#xff0c;而会话层的功能应该被放到应用层…...

122. 买卖股票的最佳时机 II

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150问题分析&#xff1a; 和买卖股票的最佳时机I这题相比&#xff0c;区别就是可以买多只股票虽然同时只能持有一支&#xff0c;但是我们还是可以…...

qt中如何判断字符串是否为数字,整数,浮点数?

在 Qt 中&#xff0c;可以使用多种方法来判断字符串是否为数字、整数或浮点数。Qt 提供了一些方便的字符串和数值处理函数&#xff0c;可以帮助你实现这些判断。以下是几种常见的方法&#xff1a; 1. 使用 QRegularExpression Qt 提供了 QRegularExpression 类&#xff0c;可…...

《GICv3_Software_Overview_Official_Release_B》学习笔记

1.不同版本的 GIC 架构及其主要功能如下图所示&#xff1a; 2.GICv2m&#xff08;Generic Interrupt Controller Virtualization Model&#xff09;是针对ARM架构的GIC&#xff08;通用中断控制器&#xff09;的一种扩展&#xff0c; GICv2m扩展为虚拟化环境中的中断管理提供了…...

告别Kibana:Elasticsearch 桌面客户端的新变革

告别Kibana&#xff1a;Elasticsearch 桌面客户端的新变革 在大数据处理与分析领域&#xff0c;Elasticsearch 及其相关技术的应用日益广泛。长期以来&#xff0c;Kibana 在数据可视化与查询管理方面占据重要地位&#xff0c;但随着技术的不断发展&#xff0c;用户对于更高效、…...

【蓝桥杯研究生组】第14届Java试题答案整理

试题链接&#xff1a;链接 A题 满足条件的答案有&#xff1a;35813116 public class TianShu {public static void main(String[] args) {int ans 0;// 2000.1.1 - 2000000.1.1// 年份是月份的倍数&#xff0c;也是日的倍数for (int year2000; year<2000000; year) {for …...

链式调用方式重写父类set方法导致fastjson解析的对象属性未赋值

反序列化后发现属性为null 昨天使用fastjson的JSON.parseArray(json, class)反序列化的时候&#xff0c;发现返回的list列表中的对象某个属性为null&#xff0c;但是json字符串里面这个属性是有值的&#xff0c;经过排查发现是因为子类重写了父类的set方法&#xff0c;且返回值…...

[AUTOSAR 基础入门] - AUTOSAR配置工具

返回总目录 前文我们提到了要借助 EasySAR 平台来助力大家更好地融合 AUTOSAR 的理论与实践&#xff0c;让大家能够切实将所学知识转化为实际操作能力。建议大家感兴趣的去注册一下看看。跳转链接&#xff1a;EasySAR EasySAR是昂辉科技基于 AUTOSAR 方法论设计的一款面向汽车…...

鸿蒙开发:实现键值数据库存储

前言 鸿蒙当中数据持久化存储&#xff0c;为我们提供了多种的实现方式&#xff0c;比如用户首选项方式&#xff0c;关系型数据库方式&#xff0c;键值型数据库方式&#xff0c;文件存储方式等等&#xff0c;对于数据量比较的小的&#xff0c;我们直接选择轻量级的用户首选项方式…...

ip属地的信息准确吗?ip归属地不准确怎么办

在数字化时代&#xff0c;IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上&#xff0c;IP属地信息都扮演着重要的角色。然而&#xff0c;随着技术的不断进步和网络的复杂性增加&#xff0c;IP属地信息的准确性问题也日益凸显。那么&#xff0c;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&#xff1a;层叠样式表…...

Android设备使用AOA协议进行主机与配件模式通信

1.使用TYPC-C数据线连接两台华为手机&#xff1a; TYPE-C线&#xff0c;先连接下图右边的ACCESSORY 再连接左边的HOST 此时左边的HOST(白色) 会给右边的ACCESSORY(黑色) 充电 接着打开左连接的HostChart会自动调起授权&#xff0c;然后会启动右边的AccessoryChart USB HOS…...

MySQL中深度分页问题的优化

MySQL中深度分页问题的优化 在MySQL中&#xff0c;使用LIMIT子句进行分页查询时&#xff0c;可能会遇到一个常见的性能问题&#xff1a;当LIMIT子句中的偏移量X很大时&#xff0c;查询速度会显著下降。例如&#xff0c;LIMIT 0,10可能只需要20毫秒&#xff0c;而LIMIT 1000000,…...

5. C语言 常量与宏定义

本章目录: 前言一、什么是常量&#xff1f;1. 整型常量2. 浮点型常量3. 字符常量4. 字符串常量 二、如何定义常量&#xff1f;1. 使用 #define 宏定义2. 使用 const 关键字 三、#define 和 const 的区别四、使用建议1. 使用场景区分2. 避免宏定义的潜在问题 五、特殊用法与小技…...

【mybatis-plus问题集锦系列】mybatis使用xml配置文件实现数据的基础增删改查

简单的数据查询&#xff0c;我们可以在mapper接口里面去实现&#xff0c;但是如果是复杂的查询&#xff0c;我们就可以使用xml配置文件去做&#xff0c; 官网链接xml配置文件 实现效果 实现代码 根据mapper接口的包结构&#xff0c;在resources包里面新建同名同结构的xml文件…...

spring防止重复点击,两种注解实现(AOP)

第一种&#xff1a;EasyLock 简介 为了简化可复用注解&#xff0c;自己实现的注解&#xff0c;代码简单随拿随用 使用方式 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宏注意事项 代码后面可以不写分号“ ; ”&#xff1b; 缩进对程序的运行影响不大&#xff0c;但为了易读&#xff08;防止自己以后看不懂&#xff09;&#xff0c;还是乖乖写好&#xff1b; 代码是逐行运行的&#xff0c;意味着下面一行代码错了&#xff0c;前面的代码…...

力扣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平台的控制程序&#xff0c;主要功能包括&#xff1a; 初始化&#xff1a;设置引脚模式、初始化编码器、舵机和EEPROM。按键检测&#xff1a;处理按钮的单击、双击和长按事件&#xff0c;并根据事件执行相应操作。编码器更新&#xff…...

ubuntu1604 apt镜像源切换

1、如何查看当前源 cat /etc/apt/sources.list less /etc/apt/sources.list 2、apt源修改为阿里镜像&#xff0c;这里ubuntu是1604&#xff1a; deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/…...

leetcode刷题笔记

题目思路1.两数之和哈希表2.两数相加链表操作3. 无重复字符的最长子串滑动窗口&#xff0c;特别注意数组越界情况&#xff01;4. 寻找两个正序数组的中位数5.最长回文子串从中间向两边扩展&#xff0c;注意整个字符串都是回文串的边界情况10.正则表达式匹配动态规划&#xff0c…...

修复 ITunes 在 Windows 或 Mac 上不断崩溃的问题 [100% 有效]

对于 iDevice 用户来说&#xff0c;只能通过 iTunes 在 iDevice 和计算机之间传输文件的困境一直是一个紧迫的问题。所有 iPhone 用户可能都知道&#xff0c;iTunes 并不是一款高效的应用程序&#xff0c;有时性能会很差&#xff0c;例如在 iDevices 和计算机之间传输文件时不断…...

Mac M2基于MySQL 8.4.3搭建(伪)主从集群

前置准备工作 安装MySQL 8.4.3 参考博主之前的文档&#xff0c;在本地Mac安装好MySQL&#xff1a;Mac M2 Pro安装MySQL 8.4.3安装目录&#xff1a;/usr/local/mysql&#xff0c;安装好的MySQL都处于运行状态&#xff0c;需要先停止MySQL服务最快的方式&#xff1a;系统设置 …...

Visual Point Cloud Forecasting enables Scalable Autonomous Driving——点云论文阅读(12)

此内容是论文总结,重点看思路!! 文章概述 这篇文章介绍了一个名为 ViDAR 的视觉点云预测框架,它通过预测历史视觉输入生成未来点云,作为自动驾驶的预训练任务。ViDAR 集成了语义、三维几何和时间动态信息,有效提升了感知、预测和规划等自动驾驶核心任务的性能。实验表明…...

handpose x plus 数据解析 >> DataBall

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” ---------------------------- 样品数据&#xff1a; 通过加入知识…...

LINUX线程操作

文章目录 线程的定义LINUX中的线程模型一对一模型多对一模型多对多模型 线程实现原理线程的状态新建状态&#xff08;New&#xff09;就绪状态&#xff08;Runnable&#xff09;运行状态&#xff08;Running&#xff09;阻塞状态&#xff08;Blocked&#xff09;死亡状态&#…...

每日一学——日志管理工具(ELK Stack)

5.1 ELK Stack 5.1.1 Elasticsearch索引机制 嘿&#xff0c;小伙伴们&#xff01;今天我们要聊聊ELK Stack——一套由Elasticsearch、Logstash和Kibana组成的强大日志管理工具集。通过这套工具&#xff0c;我们可以轻松地收集、存储、搜索和可视化日志数据。首先&#xff0c;…...