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

python轻量级框架-flask

简述

Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用,适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架,是因为它与一些大型 Web 框架(如 Django)不同,并不捆绑数据库管理、表单验证等功能,而是保持了极简的核心,只包含了路由、模板引擎和WSGI服务器的基本功能,使开发者可以根据需求选择合适的扩展来构建应用。掌握 Flask 的基础之后可以深入学习如何实现更复杂的功能,例如用户认证、API 版本管理、性能优化,以及如何与前端框架(如 Vue.js 或 React)进行集成,以构建现代的全栈应用。Flask 的设计哲学是 简单优先、灵活性强,让开发者对应用的构建过程有更多的控制。Flask 由 Armin Ronacher 开发,基于两个核心工具库:Werkzeug和Jinja2。

        Werkzeug是一个 WSGI工具包,用于处理 HTTP 请求和响应。

        Jinja2是一个灵活的模板引擎,用于生成动态 HTML 页面。

Flask 的架构是典型的 MVC(Model-View-Controller)风格中的一种实现。这种架构可以有效分离应用的业务逻辑、数据管理和视图展示,有助于保持代码的清晰性和模块化,核心功能主要包括:

基本要点

1. 路由系统

Flask 使用 @app.route() 装饰器定义 URL 路由,这使得定义一个请求的处理函数变得非常简洁。每个 URL 路径都对应一个视图函数,它负责处理来自客户端的请求并返回合适的响应。类似于之前提到过的fastapi:

from flask import Flask
app = Flask(__name__)# 路由与视图函数一一对应,程序实例需要知道每个url请求所对应的运行代码是谁,所以程序中必须要创建一个url请求地址到python运行函数的一个映射
@app.route("/hello") # 将路径 /hello 映射到函数 hello_world,当用户访问这个路径时,浏览器会得到 Hello, World! 的响应,url映射的函数,要传参则在上述route(路由)中添加参数申明
def hello_world():return "Hello, World!"# 注意:如果ip设置成0.0.0.0(不仅监听本地端口)且端口对外开发,那么在任意主机上都可以访问该地址,请确保你本地数据处于安全状态不受攻击
if __name__ == "__main__":app.run(host="127.0.0.1", port=8080, debug=False)

访问上述路径是会打印出该函数结果:

2. 请求和响应处理

Flask 对 HTTP 请求和响应的处理非常灵活。通过 flask.request 对象,可以访问请求的所有细节,如查询参数、表单数据、上传的文件等。对于响应,开发者可以使用 flask.Response 类来自定义 HTTP 响应。

from flask import Flask, requestapp = Flask(__name__)#注意路由路径不要重名,映射的视图函数也不要重名,methods表示请求方式
@app.route("/greet", methods=["GET", "POST"])
def greet():if request.method == "POST":name = request.form.get("name")return f"Hello, {name}!"return """<form method="POST">Name: <input type="text" name="name"><input type="submit" value="Submit"></form>"""if __name__ == "__main__":app.run(debug=False)

访问上述路径时如下图:

3、路由

可以在路径内以/<参数名>的形式指定参数,默认接收到的参数类型是string

以下为flask框架自带的转换器,可以置于参数前将接收的参数转化为对应类型
        string 接受任何不包含斜杠的文本
        int 接受正整数
        float 接受正浮点数
        path 接受包含斜杠的文本

当然也可以自定义转换器(pip install werkzeug):

from werkzeug.routing import BaseConverter #导入转换器的基类,用于继承方法
from flask import Flaskapp = Flask(__name__)# 自定义转换器类
class RegexConverter(BaseConverter):def __init__(self,url_map,regex):# 重写父类定义方法super(RegexConverter,self).__init__(url_map)self.regex = regexdef to_python(self, value):# 重写父类方法,后续功能已经实现好了print('to_python方法被调用')return value# 将自定义的转换器类添加到flask应用中
# 具体过程是添加到Flask类下url_map属性(一个Map类的实例)包含的转换器字典属性中
app.url_map.converters['re'] = RegexConverter
# 此处re后括号内的匹配语句,被自动传给我们定义的转换器中的regex属性
# value值会与该语句匹配,匹配成功则传达给url映射的视图函数
@app.route("/index/<re('1\d{10}'):value>")
def index(value):print(value)return "Hello World!"if __name__=='__main__':app.run(debug=False)

4、endpoint

每个实例app中都存在一个url_map,这个url_map中包含了url到endpoint的映射;当request请求传来一个url的时候,会在url_map中先通过rule找到endpoint,然后再在view_functions中根据endpoint再找到对应的视图函数view_func

from flask import Flaskapp = Flask(__name__)# endpoint默认为视图函数的名称
@app.route('/branch')
def test():return 'check success!'
# 可以在路由中修改endpoint,相当于为视图函数起别名(当视图函数名称很长时适用)
@app.route('/hello',endpoint='hello_test')
def hello_world():return 'Hello World!'if __name__ == '__main__':print(app.view_functions)print(app.url_map)app.run()
  • 可以通过view_functions查看到当前endpoint视图函数的对应情况;
  • 可以通过url_map查看当前urlendpoint的绑定情况;

endpoint默认为视图函数的名称,endpoint相当于给url起一个名字,view_functions内存储的就是url的名字到视图函数的映射,且endpoint在同一个蓝图下也不能重名,要注意即使修改endpoint为其他视图函数名,路由依然是绑定其正下方的第一个视图函数,说明endpoint作用于url,而不是作用于函数名。

5、redirect重定向

在flask 中,重定向是通过flask.redirect(location, code=302)这个函数来实现的,location表示需要重定向的url, 应该配合url_for函数来使用, code表示采用哪个重定向,默认是302,即临时性重定向, 可以修改为301来实现永性重定向;

from flask import Flask,jsonifyapp = Flask(__name__)# endpoint默认为视图函数的名称
#用jsonify库实现将json数据返回给前端
@app.route('/branch')
def test():data={'suatus':'check success!'}return jsonify(data)
# 可以在路由中修改endpoint,相当于为视图函数起别名(当视图函数名称很长时适用)
@app.route('/hello',endpoint='hello_test')
def hello_world():#doing something#...# redirect重定位(服务器向外部发起一个请求跳转)到一个url界面;# url_for给指定的函数构造 URL;# return redirect('/items') 不建议这样做,将界面限死了return redirect(url_for('items'))if __name__ == '__main__':print(app.view_functions)print(app.url_map)app.run()

6、abort函数

  • 类似于python中的raise函数,可以在需要退出请求的地方抛出错误,并结束该请求;
  • 可以使用errorhandler()装饰器来进行异常的捕获与自定义
from flask import Flask,jsonifyapp = Flask(__name__)# endpoint默认为视图函数的名称
#用jsonify库实现将json数据返回给前端
@app.route('/branch')
def test():data={'suatus':'check success!'}return jsonify(data)
# 可以在路由中修改endpoint,相当于为视图函数起别名(当视图函数名称很长时适用)@app.route('/hello',endpoint='hello_test',methods=['GET','POST'])
def hello_world():if request.method == 'GET':#doing somethingpasselse:# abort的用法类似于python中的raise,在网页中主动抛出错误abort(404)# redirect重定位(服务器向外部发起一个请求跳转)到一个url界面;# url_for给指定的函数构造 URL;# return redirect('/items') 不建议这样做,将界面限死了return redirect(url_for('items'))# 自定义错误处理方法,将404这个error与Python函数绑定
# 当需要抛出404error时,将会访问下面的代码
@app.errorhandler(404)
def handle_404_error(err):# return "发生了错误,错误情况:%s"%err# 自定义一个界面return render_template('404.html')if __name__ == '__main__':print(app.view_functions)print(app.url_map)app.run()

自定义的404界面:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!-- 注意图片文件需要放在一个静态文件夹static里 -->
<img src="../static/error404.jpg" alt="" width="1428px" height="57px">
</body>
</html>

二、Flask 的扩展与灵活性

虽然 Flask 是一个微框架,但它具有极强的灵活性,可以自由选择各种扩展来增强功能:

        Flask-SQLAlchemy:用于与关系数据库交互,提供 ORM(对象关系映射)支持。是一个流行的 Flask 扩展,它为数据库操作提供了一种更简洁、更 Pythonic 的方式。

        Flask-WTF:用于表单处理和验证,简化表单开发。

        Flask-Login:用于用户认证与会话管理。

这些扩展可以无缝集成到 Flask 应用中,使开发者在不牺牲灵活性的同时实现复杂的功能。

1、Flask-SQLAlchemy与数据库sqllite交互

#app.py
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///127.0.0.1.db"  # 相对路径
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False  # 禁用模型修改跟踪,节省资源
db = SQLAlchemy(app)
migrate = Migrate(app, db) # 数据库表结构更新迁移class bank_info(db.Model):id = db.Column(db.Integer, primary_key=True)branch_id = db.Column(db.String(80), unique=True, nullable=False)application = db.Column(db.String(120), unique=True, nullable=False)def __repr__(self):return f"<bank_info branch_id={self.branch_id}, application={self.application}>"@app.route("/add_branch_id")
def add_branch_id():# 添加一个新的分支机构branch = bank_info(branch_id="****", application="授信总额:****")# 检查是否已经存在该 branch_id 或 applicationexisting_branch = bank_info.query.filter_by(branch_id=branch.branch_id).first()if existing_branch:return "Branch ID already exists!"db.session.add(branch)db.session.commit()return "Branch added!"@app.route("/check_branch_id")
def get_branch():# 查询所有信息branches = bank_info.query.all()return "<br>".join([f"ID: {branch.id}, branch_id: {branch.branch_id}, application: {branch.application}" for branch in branches])if __name__ == "__main__":with app.app_context():db.create_all()# 在应用上下文中创建数据库表app.run(debug=False)  # 启动

运行后输入路由结果为:

查询结果同理。

注意当表结构需要变更时,需要单独执行命令:

cd ./path/ # 项目目录下,即app.py所在目录
flask db init # 初始化迁移环境,创建一个 migrations/ 文件夹
flask db migrate -m "Add email column to bank_info model"  # -m 用于写一个描述迁移的消息
flask db upgrade # 执行迁移# 如果删除了原来数据库文件需要重建
from your_app import db
db.create_all()#直接查看表结构
sqlite3 your_database.db
.schema bank_info

同时需要更新脚本:

#app.py
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///127.0.0.1.db"  # 使用相对路径
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False  # 禁用模型修改跟踪,以节省资源
db = SQLAlchemy(app)
migrate = Migrate(app, db)#执行数据库迁移class bank_info(db.Model):id = db.Column(db.Integer, primary_key=True)branch_id = db.Column(db.String(80), unique=False, nullable=False)application = db.Column(db.String(120), unique=False, nullable=False)email = db.Column(db.String(120), nullable=True)  # 添加email字段def __repr__(self):return f"<bank_info branch_id={self.branch_id}, application={self.application}, email={self.email}>"@app.route("/add_branch_id")
def add_branch_id():# 添加一个新的分支机构branch = bank_info(branch_id="**1", application="授信总额:*",email="***@163.com")# 检查是否已经存在该 branch_id 或 applicationexisting_branch = bank_info.query.filter_by(branch_id=branch.branch_id).first()if existing_branch:return "Branch ID already exists!"db.session.add(branch)db.session.commit()  # 提交到数据库return "Branch added!"@app.route("/check_branch_id")
def get_branch():# 查询所有信息branches = bank_info.query.all()return "<br>".join([f"ID: {branch.id}, branch_id: {branch.branch_id}, application: {branch.application},email:{branch.email}" for branch in branches])if __name__ == "__main__":
#    with app.app_context():
#       db.create_all()# 在应用上下文中创建数据库表app.run(debug=False)  # 启动

注意,当字段设置unique为True时,每次插入的数据必须要求不一致,否则无法插入。在项目目录下会生成对应的文件:

2、Jinja2 模板引擎的使用

Jinja2 是 Flask 的默认模板引擎,允许开发者将动态数据嵌入到 HTML 中,生成富有交互性的页面。它支持变量、控制结构(如 for 循环和 if 判断)以及宏(类似于函数的代码片段,可以复用):

#模板文件存在于 templates/hello.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Greeting</title>
</head>
<body><h1>Hello, {{ name }}!</h1>
</body>
</html>
  • render_template():可以用于呈现一个开发人员编写的html文件模板
  • request.method用于获取url接收到的请求方式,以此返回不同的响应页面

在 Flask 应用中使用这个模板:

from flask import Flask, render_template# 创建 Flask 应用实例
app = Flask(__name__)# 路由处理函数
@app.route("/greet/<name>",methods=['GET','POST'])#url映射的函数,要传参则在上述route(路由)中添加参数申明
def greet(name):if request.method == 'GET':# 想要html文件被该函数访问到,首先要创建一个templates文件,将html文件放入其中# 该文件夹需要被标记为模板文件夹,且模板语言设置为jinja2return render_template("hello.html", name=name)# 此处欲发送post请求,需要在对应html文件的form表单中设置method为postelif request.method == 'POST':pass# 启动 Flask 应用
if __name__ == '__main__':app.run(debug=False)

render_template() 函数用于渲染 hello.html 模板,并将变量 name 的值传递到模板中,从而动态生成最终的 HTML 页面.

3、构建完整的 CRUD 应用

一个典型的 Web 应用需要对数据进行创建(Create)、读取(Read)、更新(Update)和删除(Delete),这被称为 CRUD 操作。借助 Flask可以很方便地构建一个支持 CRUD 操作的应用:

#用 Flask 构建一个完整的 CRUD API。通过 HTTP 的 POST、GET、PUT 和 DELETE 方法,客户端可以实现对 Item 对象的创建、读取、更新和删除操作from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///crud.db"
db = SQLAlchemy(app)class Item(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80), unique=True, nullable=False)def to_dict(self):return {"id": self.id, "name": self.name}@app.route("/items", methods=["POST"])
def create_item():name = request.json.get("name")item = Item(name=name)db.session.add(item)db.session.commit()return jsonify(item.to_dict()), 201@app.route("/items", methods=["GET"])
def get_items():items = Item.query.all()return jsonify([item.to_dict() for item in items])@app.route("/items/<int:item_id>", methods=["PUT"])
def update_item(item_id):item = Item.query.get_or_404(item_id)item.name = request.json.get("name")db.session.commit()return jsonify(item.to_dict())@app.route("/items/<int:item_id>", methods=["DELETE"])
def delete_item(item_id):item = Item.query.get_or_404(item_id)db.session.delete(item)db.session.commit()return "", 204if __name__ == "__main__":with app.app_context():db.create_all()app.run(debug=False)

运行上行脚本,打开postman新建一个文件执行操作:

点击send如果成功则会出现:

在浏览器里面输入对应路由显示为:

表明数据新建成功。

如果想要更新或者是删除操作则分别选择put和DELETE选项,发送给对应请求,请求体路由输入对应ID即可,请求体输入对应新的名称:

4、Flask 中间件与蓝图

4.1. 中间件

中间件(Middleware)是位于请求与响应之间的代码,用于对请求或响应进行处理。Flask 的中间件可以用来做很多事情,例如:记录日志、修改请求、或在响应中增加自定义的 HTTP 头等:

from flask import Flask, jsonifyapp = Flask(__name__)# 定义在请求处理之前执行的函数
@app.before_request
def before_request_func():print("Before request is called")# 定义在响应返回之前执行的函数
@app.after_request
def after_request_func(response):print("After request is called")# 在这里你可以修改响应(如添加头信息等)response.headers["X-Custom-Header"] = "Hello World"return response# 一个简单的路由
@app.route('/')
def home():return jsonify(message="Hello, Flask!")if __name__ == '__main__':app.run(debug=True)

@app.before_request 装饰器用于定义在每个请求处理之前执行的函数。这通常用于一些预处理任务,比如验证用户身份、记录日志、设置请求上下文等。

  • 该函数表示每一次请求之前,可以执行某个特定功能的函数;
  • 可以存在多个before_request装饰器,执行顺序是由上到下,先绑定的先执行
  • 并且先执行 flask app 的 before_request, 再执行 blueprint 的 before_request;
  • 执行时机:当客户端发出请求时,Flask 在请求被处理之前调用 before_request_func
  • 常见用途:检查用户是否已经登录,处理跨域请求(CORS),或者设置数据库连接等。

@app.after_request 装饰器用于定义在每个请求处理完成后、响应返回给客户端之前执行的函数。这个函数接受一个 response 参数,可以对响应进行修改或者执行一些收尾操作。

  • 执行时机:当请求处理完成并且响应准备返回时,Flask 会调用 after_request_func。你可以对 response 进行修改(例如添加 headers、修改响应内容等)。
  • 常见用途:设置响应头、日志记录、性能监控、跨域处理等。
  • @app.before_request 和 @app.after_request 是应用级别的装饰器,适用于每一个请求。
  • @app.after_request 装饰器中的函数必须返回一个响应对象。如果没有对 response 做任何修改,至少需要返回原始的 response 对象。

@app.before_first_request:与before_request的区别是,只在第一次请求之前调用;

  • 该函数表示第一次请求之前可以执行的函数;
  • 执行顺序同样也是先绑定的先执行

@app.teardown_request:每一次请求之后都会调用;

  • 该函数接收一个参数,该参数是服务器出现的错误信息;
  • 执行顺序也是先绑定的后执行
  • 只有在请求上下文被 pop 出请求栈的时候才会直接跳转到teardown_request;
  • 所以在被正常调用之前,即使某次请求有抛出错误,该请求也都会被继续执行, 并在执行完后返回 response;

4.2. 蓝图(Blueprint)

当应用规模变大时,代码结构的组织变得至关重要。Flask 提供了 蓝图(Blueprint)组件来帮助开发者将应用模块化。在 Flask 中,应用可以通过蓝图将不同的视图函数和路由分离开来,使得代码更加结构化和易于管理。蓝图的作用是将视图函数、错误处理、静态文件、模板等逻辑与主应用程序分开,便于进行模块化开发。在一个大型应用程序中,蓝图可以将不同的功能区域分离,使得不同的功能部分有独立的管理。在 Flask 应用中,可以通过 app.register_blueprint() 将蓝图注册到应用程序中,之后蓝图中的路由和视图就会成为主应用的一部分。

将用户相关的路由逻辑组织在一个独立的蓝图中,并在主应用中注册这个蓝图,从而使代码结构更加清晰和模块化:

# 创建蓝图:user.py
from flask import Blueprint# 创建一个名为 "user" 的蓝图模块
user_bp = Blueprint("user", __name__)# 定义蓝图中的一个路由
@user_bp.route("/user/<username>")
def show_user(username):return f"User: {username}"# 注册蓝图
from flask import Flask
from user import user_bp
# from article import article_bpapp = Flask(__name__)# 注册多个蓝图
app.register_blueprint(user_bp)
# app.register_blueprint(article_bp)if __name__ == "__main__":app.run(debug=True)

5、url与视图函数的绑定

实现url与视图函数的绑定,除了使用路由装饰器@app.route,还可以通过add_url_rule(rule,endpoint=None,view_func=None)方法,其中:
        rule:设置的url
        endpoint:给url设置的名称
        view_func:指定视图函数的名称

from flask import Flask,url_forapp = Flask(__name__)@app.route('/branch',endpoint='branch')
# 底层其实是用add_url_rule实现的
def check_branch():return 'branch Hive is null'def my_test():return '这是测试查询页面'
app.add_url_rule(rule='/test',endpoint='test',view_func=my_test)# 请求上下文只有在发送request请求时才会被激活,激活后request对象被设置为全局可访问
# 其内部封装了客户端发出的请求数据报文
# 此处是主动生成一个临时的测试请求上下文
with app.test_request_context():print(url_for('test')) # 输出结果为/testif __name__ == '__main__':app.run(debug=False)

6、类试图和自定义装饰器

视图还可以由类来实现,即标准类视图:
定义时需要继承flask的views.View这一基类;
每个类视图内必须包含一个dispatch_request方法,每当类视图接收到请求时都会执行该方法,返回值的设定和视图函数相同;
视图函数可以通过@app.route和app.add_url_rule来进行注册(映射到url),但类视图只能通过app.add_url_rule来注册,注册时view_func不能直接使用类名,需要调用基类中的as_view方法来为自己取一个“视图函数名”
采用类视图的最大优势,就是可以把多个视图内相同的东西放在父类中,然后子类去继承父类;而类视图不方便的地方,就是每一个子类都要通过一个add_url_rule来进行注册。

相关文章:

python轻量级框架-flask

简述 Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用&#xff0c;适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架&#xff0c;是因为它与一些大型 Web 框架…...

Git实用指南:忽略文件、命令别名、版本控制、撤销修改与标签管理

目录 1.忽略特殊文件 1.1.那如何配置我们需要忽略的文件的呢&#xff1f; 1.2.如何检验效果&#xff1f; 2.给命令配置别名 3.基本操作之版本回退 3.1.使用场景&#xff1a; 3.2.使用方法&#xff1a; 4.撤销修改 情况一&#xff1a;对于工作区的代码&#xff0c;还没…...

神经网络常见面试题

梯度消失和梯度爆炸 1. 梯度消失&#xff08;Vanishing Gradient&#xff09; 定义&#xff1a; 梯度消失是指在反向传播过程中&#xff0c;梯度逐渐变得非常小&#xff0c;导致前面几层的权重更新非常缓慢&#xff0c;甚至几乎不更新&#xff0c;从而影响网络的学习过程。特…...

数据结构漫游记:动态实现栈(stack)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

PyTorch使用教程- Tensor包

### PyTorch使用教程- Tensor包 PyTorch是一个流行的深度学习框架&#xff0c;它提供了一个易于使用的API来创建和操作张量&#xff08;Tensors&#xff09;。张量是一个多维数组&#xff0c;类似于NumPy中的ndarray&#xff0c;但它是基于GPU的&#xff0c;支持自动求导。本文…...

在 Vue 3 项目中集成和使用 vue3-video-play

前言 随着视频内容的普及&#xff0c;视频播放功能在现代 Web 应用中变得越来越重要。如果你正在开发一个 Vue 3 项目&#xff0c;并且需要快速集成视频播放功能&#xff0c;vue3-video-play 是一个轻量级且易于使用的 Vue 3 组件。本文将介绍如何在 Vue 3 项目中使用 vue3-vi…...

02_登录窗口

新建场景 重命名为GameRoot 双击GameRoot进入新场景 同样摄像机清除格式 删除平行光并关闭渲染灯光的天空盒 新建空节点重命名为GameRoot GameRoot为游戏的根节点 在整个游戏中都不会被删除 在游戏的根节点下创建UI的根节点Canvas 创建一个空节点 作为UI根节点下的 登录场景UI…...

基于 JFinal 的国产微服务框架

Jboot 是一个基于 JFinal、Dubbo、Seata、Sentinel、ShardingSphere、Nacos 等开发的国产框架。 其特点是&#xff1a; 1、基于 JFinal 完整的 MVC ORM 支持。2、支持多数据源、分库分表和分布式事务。3、支持 Dubbo RPC 的完整功能&#xff0c;有超过 1亿 用户产品正在使用…...

ASP.NET Core - 配置系统之配置提供程序

ASP.NET Core - 配置系统之配置提供程序 3. 配置提供程序3.1 文件配置提供程序3.1.1 JSON配置提供程序3.1.2 XML配置提供程序3.1.3 INI配置提供程序 3.2 环境变量配置提供程序3.3 命令行配置提供程序3.4 内存配置提供程序3.5 配置加载顺序 3.6 默认配置来源 3. 配置提供程序 前…...

Axios 封装:处理重复调用与内容覆盖问题

问题描述&背景 下拉选择框&#xff0c;支持搜索&#xff0c;搜索时携带参数调用接口并更新下拉选项下拉选择连续进行多次搜索&#xff0c;先请求但响应时间长的返回值会覆盖后请求但响应时间短的举例&#xff1a; 搜索后先清空选项&#xff0c;再输入内容进行搜索。清空后…...

MySQL程序之:使用DNS SRV记录连接到服务器

在域名系统&#xff08;DNS&#xff09;中&#xff0c;SRV记录&#xff08;服务位置记录&#xff09;是一种资源记录&#xff0c;它使客户端能够指定指示服务、协议和领域的名称。DNS查找该名称会返回一个回复&#xff0c;其中包含该领域中提供所需服务的多个可用服务器的名称。…...

Swift Parameter-free Attention Network模型详解及代码复现

研究动机 在深度学习领域,超分辨率技术的发展面临着 模型复杂度与推理速度 之间的权衡。传统的基于注意力的超分辨率网络虽然能提高性能,但往往需要较大的感受野和参数化的注意力图,这可能导致推理速度下降。 为了解决这一问题,研究人员提出了Swift Parameter-free Atten…...

React进阶之react.js、jsx模板语法及babel编译

React React介绍React官网初识React学习MVCMVVM JSX外部的元素props和内部的状态statepropsstate 生命周期constructorgetDerivedStateFromPropsrendercomponentDidMount()shouldComponentUpdategetSnapshotBeforeUpdate(prevProps, prevState) 创建项目CRA&#xff1a;create-…...

渗透测试之XEE[外部实体注入]漏洞 原理 攻击手法 xml语言结构 防御手法

目录 原理 XML语言解释 什么是xml语言&#xff1a; 以PHP举例xml外部实体注入 XML语言结构 面试题目 如何寻找xxe漏洞 XEE漏洞修复域防御 提高版本 代码修复 php java python 手动黑名单过滤(不推荐) 一篇文章带你深入理解漏洞之 XXE 漏洞 - 先知社区 原理 XXE&…...

macOS安装Gradle环境

文章目录 说明安装JDK安装Gradle 说明 gradle8.5最高支持jdk21&#xff0c;如果使用jdk22建议使用gradle8.8以上版本 安装JDK mac系统安装最新&#xff08;截止2024.9.13&#xff09;Oracle JDK操作记录 安装Gradle 下载Gradle&#xff0c;解压将其存放到资源java/env目录…...

openwrt下oaf插件编译安装,实现上网行为监控

文章目录 入门级APP青少年模式设备屏幕使用时间电脑浏览器使用时间限制Surpal 介绍安装使用进阶级专业级旁路由方案openwrt路由器固件编译OAF(Open App Filter)安装编译带有oaf的固件固件烧写设备上电启动应用特征库设置黑白名单及应用访问限制骨灰级ref守护孩子视力,用科技“…...

Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测

Top期刊算法&#xff01;RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 Top期刊算法&#xff01;RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于RIME-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention、R…...

GPT-4o背后的语音技术

GPT-4o背后的语音技术 GPT-4o是一个any2any的多模态模型,能够接受文本、音频、图像、视频等多模态输入,也能够生成包含文本、语音、图像和视频等混合内容的多模态输出。本文主要谈语音多模态的实现,并分享一些对于语音研究未来发展的看法。 GPT-4o (“o” 代表 “omni”) …...

数据库存储上下标符号,sqlserver 2008r2,dm8

sqlserver 2008r2&#xff1a; 数据类型需要用nvarchar插入数据时字符串前需要用N create table test( col1 varchar(50), col2 nvarchar(50) ) insert into test(col1,col2) values(U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀,U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀) insert into…...

【25】Word:林涵-科普文章❗

目录 题目​ NO1.2.3 NO4.5.6 NO7.8 NO9.10 NO11.12 不连续选择&#xff1a;按住ctrl按键&#xff0c;不连续选择连续选择&#xff1a;按住shift按键&#xff0c;选择第一个&#xff0c;选择最后一个。中间部分全部被选择 题目 NO1.2.3 布局→纸张方向&#xff1a;横向…...

全面解析计算机网络:从局域网基础到以太网交换机!!!

一、局域网的基本概念和体系结构 特点: 覆盖较小的地理范围较低的时延和误码率局域网内的各节点之间以“帧"为单位进行传输支持单播、广播、多播 单播(一对一发送帧)&#xff1a;如 A->B广播(一对全部发送帧)&#xff1a;如 A->BCDEFG多播(一对部分发送帧)&#xff…...

《 C++ 点滴漫谈: 二十二 》操作符炼金术:用C++ operator重塑代码美学

摘要 C 的 operator 关键字和操作符重载是语言的核心特性之一&#xff0c;使开发者能够扩展内置操作符以适应自定义类型&#xff0c;从而实现更高效、直观的代码表达。本文全面解析了 operator 关键字的基本概念、支持重载的操作符范围及其使用场景&#xff0c;详细介绍了操作…...

Ubuntu 22.04 TLS 忘记root密码,重启修改的解决办法

1.想办法进入这个界面&#xff0c;我这里是BIOS引导的是按Esc按一下就行&#xff0c;UEFI的貌似是按Shift不得而知&#xff0c;没操作过。下移到Advanced options for Ubuntu&#xff0c;按enter 2.根据使用的内核版本&#xff0c;选择带「recovery mode」字样的内核版本&#…...

【LeetCode: 215. 数组中的第K个最大元素 + 快速选择排序】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

GraphRAG: Auto Prompt Tuning 实践

GraphRAG 的 Auto Prompt Tuning 功能是一个强大的工具&#xff0c;用于优化知识图谱的生成过程。以下是对该功能的详细介绍和分析&#xff1a; 自动提示调优&#xff08;Auto Prompt Tuning&#xff09; 1. 概念 GraphRAG 的自动提示调优功能旨在为特定领域的知识图谱生成创…...

提示词的艺术----AI Prompt撰写指南(个人用)

提示词的艺术 写在前面 制定提示词就像是和朋友聊天一样&#xff0c;要求我们能够清楚地表达问题。通过这个过程&#xff0c;一方面要不断练习提高自己地表达能力&#xff0c;另一方面还要锻炼自己使用更准确精炼的语言提出问题的能力。 什么样的提示词有用&#xff1f; 有…...

Tensor 基本操作1 | PyTorch 深度学习实战

目录 创建 Tensor常用操作unsqueezesqueezeSoftmax代码1代码2代码3 argmaxitem 创建 Tensor 使用 Torch 接口创建 Tensor import torch参考&#xff1a;https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html 常用操作 unsqueeze 将多维数组解套&#xf…...

CSS 的基础知识及应用

前言 CSS&#xff08;层叠样式表&#xff09;是网页设计和开发中不可或缺的一部分。它用于描述网页的视觉表现&#xff0c;使页面不仅实现功能&#xff0c;还能提供吸引人的用户体验。本文将介绍 CSS 的基本概念、语法、选择器及其在提升网页美观性方面的重要性。 什么是 CSS&…...

贪心算法(题1)区间选点

输出 2 #include <iostream> #include<algorithm>using namespace std;const int N 100010 ;int n; struct Range {int l,r;bool operator <(const Range &W)const{return r<W.r;} }range[N];int main() {scanf("%d",&n);for(int i0;i&l…...

CamemBERT:一款出色的法语语言模型

摘要 预训练语言模型在自然语言处理中已无处不在。尽管这些模型取得了成功&#xff0c;但大多数可用模型要么是在英语数据上训练的&#xff0c;要么是在多种语言数据拼接的基础上训练的。这使得这些模型在除英语以外的所有语言中的实际应用非常有限。本文探讨了为其他语言训练…...

解决 IntelliJ IDEA 项目包后出现“% classes”和“% lines covered”的问题

前言 在使用 IntelliJ IDEA 开发 Java 或其他支持的语言时&#xff0c;您可能会遇到项目包后面意外地出现了“% classes”和“% lines covered”的信息。这些百分比表示的是代码覆盖率&#xff08;Coverage&#xff09;&#xff0c;它们展示了您的测试覆盖了多少比例的类和代码…...

Matlab总提示内存不够用,明明小于电脑内存

目录 前言情况1&#xff08;改matlab最大内存限制&#xff09;情况2&#xff08;重启电脑&#xff09;情况3 前言 在使用matlab中&#xff0c;有时候需要占用的内存并没有超过电脑内存依旧会报错&#xff0c;提示内存不够用&#xff0c;可以尝试下面几种方法&#xff0c;总有一…...

Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)

1. OpenCV简介 1.1 OpenCV定义与功能 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它为计算机视觉应用程序提供了一个通用的基础设施&#xff0c;并加速了在商业产品中使用机器感知。作为BSD许可的产品&…...

leetcode707-设计链表

leetcode 707 思路 本题也是用了虚拟头节点来进行解答&#xff0c;这样的好处是&#xff0c;不管是头节点还是中间的节点都可以当成是中间节点来处理&#xff0c;用同一套方法就可以进行处理&#xff0c;而不用考虑太多的边界条件。 下面题目中最主要的实现就是添加操作addA…...

Linux操作命令之云计算基础命令

一、图形化界面/文本模式 ctrlaltF2-6 图形切换到文本 ctrlalt 鼠标跳出虚拟机 ctrlaltF1 文本切换到图形 shift ctrl "" 扩大 ctrl "-" 缩小 shift ctrl "n" 新终端 shift ctrl "t" 新标签 alt 1,…...

HTML<bdo>标签

例子 指定文本方向&#xff1a; <bdo dir"rtl"> This text will go right-to-left. </bdo> <!DOCTYPE html> <html> <body> <h1>The bdo element</h1> <p>This paragraph will go left-to-right.</p> …...

将IDLE里面python环境pyqt5配置的vscode

首先安装pyqt5全套&#xff1a;pip install pyqt5-tools 打开Vscode&#xff1a; 安装第三方扩展&#xff1a;PYQT Integration 成功配置designer.exe的路径【个人安装pyqt5的执行路径】&#xff0c;便可直接打开UI文件&#xff0c;进行编辑。 配置pyuic,如果下图填写方法使用…...

【C++】结构体(下)

4、结构体指针 作用&#xff1a;通过指针访问结构体中的成员 利用操作符“----->”可以通过结构体指针访问结构体成员。 示例&#xff1a; #include<iostream> #include<string> using namespace std; struct student {//姓名string name;//年龄int age;//分数…...

YOLOv10-1.1部分代码阅读笔记-dataset.py

dataset.py ultralytics\data\dataset.py 目录 dataset.py 1.所需的库和模块 2.class YOLODataset(BaseDataset): 3.class ClassificationDataset(torchvision.datasets.ImageFolder): 4.def load_dataset_cache_file(path): 5.def save_dataset_cache_file(prefix,…...

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…...

Mixly米思齐1.0 2.0 3.0 软件windows版本MAC苹果电脑系统安装使用常见问题与解决

Mixly软件应用常见问题 Mixly米思齐编译或上传报错&#xff1f; 1、软件安装与驱动&#xff08;Mixly1-2&#xff09; 1-1 Windows版本 软件及驱动可以在Mixly群&#xff08;QQ群号621937623&#xff09;的群文件夹中找到&#xff0c;或到Mixly在线软件下载链接中重新下安装…...

在 QNAP NAS中使用 Container Station 运行 Docker 的完整指南

QNAP 为用户提供了一个名为 Container Station 的应用&#xff0c;它在 QNAP NAS 上将 Docker 和 LXC 结合在一起&#xff0c;通过图形化界面&#xff0c;让用户更轻松地在 NAS 上管理容器。本文将带你一步步了解如何在 QNAP NAS 上安装和使用 Container Station&#xff0c;以…...

Spark RPC 学习总结

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff1a;https://www.captainai.net/dongkelun 前言 本文从API层面学习总结Spark RPC,暂不涉及源码分析。 Spark 通信历史 最开始: …...

JAVA安全—JWT攻防Swagger自动化Druid泄露

前言 依旧是Java安全的内容&#xff0c;今天主要是讲JWT这个东西&#xff0c;JWT之前讲过了&#xff0c;是Java中特有的身份校验机制&#xff0c;原理我就不再多说了&#xff0c;主要是看看它的安全问题&#xff0c;至于Swagger和Druid顺便讲一下。 Druid泄露 Druid是阿里巴…...

深度学习核函数

一、核函数的基本概念 核函数在机器学习中具有重要应用价值&#xff0c;常用于支持向量机&#xff08;SVM&#xff09;等算法中。 核函数是面试中经常被考到的知识点&#xff0c;对于找工作和实际数据转换都有重要作用。 二、数据建模与核函数的作用 数据越多&#xff0c;可…...

【神经网络基础】

目录 一、神经网络的构成 1.1什么是神经网络&#xff1f; 1.2 激活函数 1.2.1 Sigmoid 1.2.2 Tanh 1.2.3 ReLU 1.2.4 softmax 1.2.5 其他激活函数 1.2.6 选择激活函数 1.3 参数初始化 1.4 模型构建 二、损失函数 2.1 分类问题 2.1.1多分类&#xff08;多分类交叉…...

一些面试常见问题及其回答参考

1、请你自我介绍一下你自己&#xff1f; 回答提示&#xff1a;一般人回答这个问题过于平常&#xff0c;只说姓名、年龄、爱好、工作经验&#xff0c;这些在简历上都有。其实&#xff0c;企业最希望知道的是求职者能否胜任工作&#xff0c;包括&#xff1a;最强的技能、最深入研…...

[JavaScript] 深入理解流程控制结构

文章目录 1. **if-else 语句**基本语法&#xff1a;示例&#xff1a;扩展&#xff1a;else if 2. **switch-case 语句**基本语法&#xff1a;示例&#xff1a;注意事项&#xff1a; 3. **for 循环**基本语法&#xff1a;示例&#xff1a;扩展&#xff1a;for-in 和 for-of 4. *…...

Mysql常见问题处理集锦

Mysql常见问题处理集锦 root用户密码忘记&#xff0c;重置的操作(windows上的操作)MySQL报错&#xff1a;ERROR 1118 (42000): Row size too large. 或者 Row size too large (&#xff1e; 8126).场景&#xff1a;报错原因解决办法 详解行大小限制示例&#xff1a;内容来源于网…...

高级java每日一道面试题-2025年01月19日-框架篇[Mybatis篇]-MyBatis 中见过什么设计模式 ?

如果有遗漏,评论区告诉我进行补充 面试官: MyBatis 中见过什么设计模式 ? 我回答: 1. 工厂模式&#xff08;Factory Pattern&#xff09; 定义&#xff1a;工厂模式是一种创建型模式&#xff0c;它提供了一种创建对象的最佳方式&#xff0c;将对象创建过程抽象化&#xff…...