Python Flask 数据库开发
Python Flask 数据库开发
- 引言
- 环境配置
- 创建 Flask 应用,连接数据库
- 定义路由
- 定义模型
- 创建表
- 创建 API
- 数据库直接操作
- 启动 Flask 应用
- app.py 示例
- 运行 Flask
- 访问应用
- 展望
引言
在现代 web 开发中,Python 的 Flask 框架因其轻量和灵活性受到广泛欢迎。结合数据库技术,Flask 可以高效地管理和处理数据,使开发者能够快速构建功能强大的应用程序。无论是选择 MySQL 还是 PostgreSQL,掌握数据库与 Flask 的集成至关重要。本文将探讨如何在 Flask 中设置和使用数据库,涵盖从环境配置到基本操作的各个方面,便于我们去实现数据驱动的应用。
环境配置
在开始之前,需要确保 Python 环境已安装 Flask 模块。可以通过 pip 安装 Flask 和 SQLAlchemy(Flask 的 ORM 工具):
pip install Flask Flask-SQLAlchemy
接下来,根据所选数据库的类型(如 MySQL 或 PostgreSQL),部署相应的数据库服务。
详情可参考:MySQL && PostgreSQL 数据库部署
创建 Flask 应用,连接数据库
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
# 创建了一个 Flask 应用实例。__name__ 是 Python 的一个特殊变量,它指向当前模块的名字。app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:password@localhost/dbname'
# mysql://user:password@localhost/dbname 的格式是:
# mysql:数据库类型。
# user:数据库用户名。
# password:数据库密码。
# localhost:数据库服务器地址(这里是本地)。
# dbname:要连接的数据库名称。db = SQLAlchemy(app)
# 创建了一个 SQLAlchemy 对象,并将 Flask 应用实例传递给它。这样,SQLAlchemy 就可以使用 Flask 应用的配置来管理数据库操作# @app.route 是 Flask 中的装饰器,用于定义路由。它将一个 URL 路径与一个视图函数关联起来。简单来说,当用户访问指定的 URL 时,Flask 会调用对应的视图函数并返回结果
@app.route('/')
def home():return 'Hello, Flask!'if __name__ == '__main__':app.run(debug=True)
定义路由
@app.route 是 Flask 中的装饰器,用于定义路由。它将一个 URL 路径与一个视图函数关联起来。简单来说,当用户访问指定的 URL 时,Flask 会调用对应的视图函数并返回结果。例如:
@app.route('/')
def home():return 'Hello, Flask!'
在这个例子中,访问根 URL (/) 时,用户会看到 “Hello, Flask!” 的消息。通过使用不同的路径和方法(如 GET 或 POST),我们可以创建丰富的 Web 应用。
定义模型
使用 SQLAlchemy 的 ORM(对象关系映射)定义数据库模型是与数据库交互的第一步。数据库模型是用于定义和组织数据库中数据结构的抽象框架。它描述了数据的类型、关系、约束以及如何在数据库中存储和检索数据。
一个清晰的数据库模型会大大提高开发效率和数据管理的质量,比如说:
- 创建表:通过模型定义表的结构(字段类型、约束等)。
- 执行 CRUD 操作:模型使得创建、读取、更新和删除数据变得简单。
- 维护数据完整性:模型可以设置约束(如唯一性、外键),确保数据的正确性。
- 简化查询:通过模型,可以使用 ORM(对象关系映射)库,轻松编写查询。
# 创建一个名为 DiagnosisCategory 的类,继承自 db.Model,这是 SQLAlchemy 中所有模型类的基类
class DiagnosisCategory(db.Model):__tablename__ = 'diagnosis_category' # 设置表名# 定义一个名为 id 的列,类型为 Integer。primary_key=True 表示这个列是主键,用于唯一标识每个用户。id = db.Column(db.Integer, primary_key=True)# 定义一个名为 name 的列,类型为 String,最大长度为 80。unique=True 表示这个列的值在数据库中必须是唯一的,nullable=False 表示该字段不能为空。name = db.Column(db.String(80), unique=True, nullable=False)def __repr__(self):return f'<User {self.username}>'
创建表
要创建 diagnosis_category
这张表,只需在应用上下文中调用 db.create_all(),就会自动生成 User 表。这样,数据库中就会有一个新的 DiagnosisCategory 表 (diagnosis_category) 用于存储用户信息。
class DiagnosisCategory(db.Model):__tablename__ = 'diagnosis_category'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80))def __repr__(self):return f'<User {self.username}>'# 创建表
with app.app_context():db.create_all()
创建 API
使用 Flask-Restless 创建的 API 可以通过 HTTP 请求进行 CRUD 操作。其中,collection_name 定义了访问特定资源的 URL 路径。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restless import APIManagerapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///yourdatabase.db'
db = SQLAlchemy(app)# 定义模型
class DiagnosisCategory(db.Model):__tablename__ = 'diagnosis_category'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80))# 创建数据库表
with app.app_context():db.create_all()# 创建 API 管理器
manager = APIManager(app, session=db.session)# 创建 API 端点
manager.create_api(DiagnosisCategory, collection_name='category',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])
访问这个 API 的路径将是 /api/category,前端代码(ts、js等)可以通过这个路径对后端服务器进行 CRUD 操作。
// 获取所有分类(GET 请求):
GET /api/category// 创建新分类(POST 请求):
POST /api/category// 获取特定分类(GET 请求,假设 ID 为 1):
GET /api/category/1// 更新特定分类(PUT 请求,假设 ID 为 1):
PUT /api/category/1// 删除特定分类(DELETE 请求,假设 ID 为 1):
DELETE /api/category/1
数据库直接操作
在 Flask 中,也可以使用 SQLAlchemy 提供的 API 直接操作数据库,使用 Python 对象进行 CRUD。
# 创建
new_user = User(username='example') # 创建新用户实例
db.session.add(new_user) # 将新用户添加到会话
db.session.commit() # 提交事务以保存更改# 查询
users = User.query.all() # # 查询所有用户# 更新
user = User.query.first() # # 查询第一个用户
user.username = 'new_username'
db.session.commit()# 删除
db.session.delete(user) # 删除用户
db.session.commit()
启动 Flask 应用
app.py 示例
我们以一个实际应用为例:连接远程主机(10.2.0.92)上的 MySQL数据库,创建 t_diag_category、t_diag_model、t_diag_test_suite、t_diag_test_target、t_diag_test_result 五张表,定义相应的 CRUD 接口,实现基于表的SN字段查重、关系表获取等额外操作。
# -*- coding: UTF-8 -*-import os
import shutil
import sys
import argparse
import json
from flask import Flask, make_response, request, jsonify, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text
from flask_restless import APIManager
from datetime import datetimeCURRENT_PATH = os.path.dirname(os.path.realpath(sys.argv[0]))
DB_SERVER = '10.2.0.92'
DB_PORT = '3306'
DB_USERNAME = 'root'
DB_PASSWORD = '123456'
DB_NAME = 'diagnosisdev'app = Flask(__name__)
db = None
manager = Nonedef initialize():global appglobal dbglobal manager# Databaseapp.config['SQLALCHEMY_DATABASE_URI'] = f'mysql://{DB_USERNAME}:{DB_PASSWORD}@{DB_SERVER}:{DB_PORT}/{DB_NAME}?charset=utf8mb4'app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Truedb = SQLAlchemy(app)manager = APIManager(app, session=db.session)class DiagnosisCategory(db.Model):__tablename__ = 't_diag_category'id = db.Column(db.Integer, primary_key=True, autoincrement=True)parent_id = db.Column(db.Integer, nullable=False, default=-1)name = db.Column(db.Text)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.utcnow)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.utcnow)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)class DiagnosisModel(db.Model):__tablename__ = 't_diag_model'id = db.Column(db.Integer, primary_key=True, autoincrement=True)parent_id = db.Column(db.Integer, nullable=False, default=-1)category_id = db.Column(db.Integer, db.ForeignKey('t_diag_category.id'))category = db.relationship('DiagnosisCategory', backref='t_diag_model')name = db.Column(db.Text)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.utcnow)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.utcnow)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)image_url = db.Column(db.Text)class TestSuite(db.Model):'''for test:curl http://127.0.0.1:50000/api/test_suite -H "Accept: application/vnd.api+json"curl http://127.0.0.1:50000/api/test_suite/1 -H "Accept: application/vnd.api+json"curl -X POST http://127.0.0.1:50000/api/test_suite -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -d '{"data":{"type": "test_suite", "attributes": {"name": "xxx", "data": "123"}}}'curl -X PATCH http://127.0.0.1:50000/api/test_suite/1 -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -d '{"data":{"type": "test_suite", "id": "1", "attributes": {"name": "xxx", "data": "123"}}}''''__tablename__ = 't_diag_test_suite'id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.Text)type = db.Column(db.Text)model_id = db.Column(db.Integer, db.ForeignKey('t_diag_model.id'))model = db.relationship('DiagnosisModel', backref='t_diag_test_suite')report_name = db.Column(db.Text)data = db.Column(db.Text)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.utcnow)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.utcnow)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)sop_url = db.Column(db.Text)case_type = db.Column(db.INT)# ALTER TABLE t_diag_test_suite ADD COLUMN sop_url TEXT;# ALTER TABLE t_diag_test_suite DROP COLUMN sop_url;class TestTarget(db.Model):__tablename__ = 't_diag_test_target'id = db.Column(db.Integer, primary_key=True, autoincrement=True)parent_id = db.Column(db.Integer, nullable=False, default=-1)model_id = db.Column(db.Integer, db.ForeignKey('t_diag_model.id'))model = db.relationship('DiagnosisModel', backref='t_diag_test_target')name = db.Column(db.Text)sn = db.Column(db.Text)is_hardware_changed = db.Column(db.Integer, default=0)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.utcnow)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.utcnow)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)class TestResult(db.Model):__tablename__ = 't_diag_test_result'id = db.Column(db.Integer, primary_key=True, autoincrement=True)target_id = db.Column(db.Integer, db.ForeignKey('t_diag_test_target.id'))target = db.relationship('TestTarget', backref='t_diag_test_result')test_suite_id = db.Column(db.Integer, db.ForeignKey('t_diag_test_suite.id'))test_suite = db.relationship('TestSuite', backref='t_diag_test_result')name = db.Column(db.Text)data = db.Column(db.Text)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.now)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.now)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)with app.app_context():db.create_all()manager.create_api(DiagnosisCategory, collection_name='category',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])manager.create_api(DiagnosisModel, collection_name='model',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])manager.create_api(TestSuite, collection_name='test_suite',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])manager.create_api(TestTarget, collection_name='test_target',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])manager.create_api(TestResult, collection_name='test_result',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])@app.route('/')
def hello():return 'Hello, world!'@app.route('/api/is_scrapped_sn/<sn>', methods=['GET'])
def is_scrapped_sn(sn):try:result = db.session.execute(text('SELECT COUNT(1) FROM t_diag_test_target WHERE sn = :sn AND scrap = 1'), {'sn': sn})return '1' if list(result)[0][0] > 0 else '0'except Exception as e:print(e)return '0'@app.route('/api/is_duplicate_primary_sn/<sn>', methods=['GET'])
def is_duplicate_primary_sn(sn):try:result = db.session.execute(text('SELECT COUNT(1) FROM t_diag_test_target WHERE sn = :sn AND enabled = 1 AND parent_id = -1'), {'sn': sn})return '1' if list(result)[0][0] > 0 else '0'except Exception as e:print(e)return '0'@app.route('/api/is_duplicate_relationship_sn/<sn>', methods=['GET'])
def is_duplicate_relationship_sn(sn):try:result = db.session.execute(text('SELECT COUNT(1) FROM t_diag_test_target WHERE sn = :sn AND enabled = 1 AND parent_id != -1'), {'sn': sn})return '1' if list(result)[0][0] > 0 else '0'except Exception as e:print(e)return '0'@app.route('/api/disable_sn/<sn>', methods=['GET'])
def disable_sn(sn):with db.session.begin():try:db.session.execute(text('UPDATE t_diag_test_target SET enabled = 0 WHERE parent_id IN (SELECT id FROM t_diag_test_target WHERE sn = :sn)'), {'sn': sn})db.session.execute(text('UPDATE t_diag_test_target SET enabled = 0 WHERE sn = :sn'), {'sn': sn})db.session.commit()return '0'except Exception as e:print(e)db.session.rollback()return '-1'@app.route('/api/get_relationship_sn/<sn>', methods=['GET'])
def get_relationship_sn(sn):try:result = db.session.execute(text('WITH RECURSIVE cte(id, parent_id, sn, psn) AS (SELECT id, parent_id, sn, psn FROM v_diag_valid_test_target WHERE sn = :sn UNION ALL SELECT t1.id, t1.parent_id, t1.sn, t1.psn FROM v_diag_valid_test_target t1, cte WHERE t1.psn = cte.sn) SELECT * FROM cte'), {'sn': sn})data = [row[2] for row in result.fetchall()]print(data)return json.dumps(data)except Exception as e:print(e)return jsonify('[]')@app.route('/api/get_relationship_table/<sn>', methods=['GET'])
def get_relationship_table(sn):try:result = db.session.execute(text("WITH RECURSIVE cte(sn, path) AS (SELECT sn, CAST(sn AS CHAR) FROM v_diag_valid_test_target WHERE sn = :sn UNION ALL SELECT t1.sn, CONCAT(cte.path, '.', t1.sn) FROM v_diag_valid_test_target t1 INNER JOIN cte ON t1.psn = cte.sn) SELECT path FROM cte ORDER BY path"), {'sn': sn})output = {}for data in result.fetchall():keys = data[0].split('.')temp = outputfor key in keys:temp.setdefault(key, {"info": get_sn_info(key), "subsn": {}})temp = temp[key]["subsn"]json_output = json.dumps(output)return json_outputexcept Exception as e:print(e)return jsonify('[]')@app.route('/api/sn_scrap', methods=['POST'])
def sn_scrap():try:sn_lists = request.jsonsql_query = """UPDATE t_diag_test_targetSET enabled = 0 WHERE enabled = 1AND parent_id IN (SELECT id FROM (SELECT id FROM t_diag_test_target WHERE sn IN :sn_list) AS T1)OR (sn IN :sn_list)"""db.session.execute(text(sql_query), {"sn_list": tuple(sn_lists)})sql_query = "UPDATE t_diag_test_target SET scrap = 1 WHERE sn IN :sn_list"db.session.execute(text(sql_query), {"sn_list": tuple(sn_lists)})db.session.commit()return '0'except Exception as e:db.session.rollback()print(e)return '-1'if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('path', nargs='*')parser.add_argument('--db_name', type=str, default='diagnosisdev',help="mode: dev or null")parser.add_argument('--db_server', type=str, default='10.2.0.92',help="database server ip address")parser.add_argument('--db_port', type=str, default='3306',help="database server port")parser.add_argument('--db_username', type=str, default='root',help="database server username")parser.add_argument('--db_password', type=str, default='123456',help="database server password")args = parser.parse_args()DB_SERVER = args.db_serverDB_PORT = args.db_portDB_USERNAME = args.db_usernameDB_PASSWORD = args.db_passwordDB_NAME = args.db_nameinitialize()app.run(host='0.0.0.0', port=50000, debug=True)
运行 Flask
在终端中导航到你的 Flask 应用文件所在的目录,然后运行:
python app.py
访问应用
打开浏览器,访问 http://127.0.0.1:5000/,你应该能看到 “Hello, Flask!” 的消息。
使用 curl 工具与运行在本机(127.0.0.1)的50000端口上的API进行交互。
-
获取测试套件列表
curl http://127.0.0.1:50000/api/test_suite -H "Accept: application/vnd.api+json"
这个命令用于获取所有测试套件的列表。它向 /api/test_suite 发送一个GET请求,并指定接受的内容类型为 application/vnd.api+json,即JSON API格式。
-
获取特定ID的测试套件
curl http://127.0.0.1:50000/api/test_suite/1 -H "Accept: application/vnd.api+json"
这个命令用于获取ID为1的测试套件的详细信息。它向 /api/test_suite/1 发送一个GET请求,同样指定接受的内容类型为 application/vnd.api+json。
-
创建新的测试套件
curl -X POST http://127.0.0.1:50000/api/test_suite -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -d '{"data":{"type": "test_suite", "attributes": {"name": "xxx", "data": "123"}}}'
这个命令用于创建一个新的测试套件。它向 /api/test_suite 发送一个POST请求,并在请求体中提供要创建的测试套件的数据。这里指定了 Content-Type 为 application/vnd.api+json,表示发送的数据是JSON API格式,同时指定接受的内容类型也是 application/vnd.api+json。请求体中包含了一个 data 对象,其 type 为 test_suite,attributes 中包含了测试套件的名称和数据。
-
更新特定ID的测试套件
curl -X PATCH http://127.0.0.1:50000/api/test_suite/1 -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -d '{"data":{"type": "test_suite", "id": "1", "attributes": {"name": "xxx", "data": "123"}}}'
这个命令用于更新ID为1的测试套件的信息。它向 /api/test_suite/1 发送一个PATCH请求,并在请求体中提供更新后的测试套件数据。与创建请求类似,这里也指定了 Content-Type 和 Accept 为 application/vnd.api+json。请求体中的 data 对象包含了 type(test_suite)、id(1)以及更新后的 attributes。
这些命令展示了如何使用 curl 工具与遵循JSON API规范的API进行基本的CRUD(创建、读取、更新、删除)操作。注意,实际的API实现可能会对这些请求有不同的要求,比如认证、权限等,这些在示例中没有体现。
展望
通过以上步骤,我们知道了如何在 Flask 应用中集成 MySQL 或 PostgreSQL 数据库。后续,可以深入学习更复杂的查询和数据库迁移等高级主题,以充分利用 Flask 和数据库的强大功能。
相关文章:
Python Flask 数据库开发
Python Flask 数据库开发 引言环境配置创建 Flask 应用,连接数据库定义路由定义模型创建表创建 API 数据库直接操作启动 Flask 应用app.py 示例运行 Flask访问应用 展望 引言 在现代 web 开发中,Python 的 Flask 框架因其轻量和灵活性受到广泛欢迎。结合…...
深度学习(七)深度强化学习:融合创新的智能之路(7/10)
一、深度强化学习的崛起 深度强化学习在人工智能领域的重要地位 深度强化学习作为一种融合了深度学习和强化学习的新技术,在人工智能领域占据着至关重要的地位。它结合了深度学习强大的感知能力和强化学习优秀的决策能力,能够处理复杂的任务和环境。例如…...
mac电脑通过 npm 安装 @vue/cli脚手架超时问题;
npm 安装 vue/cli遇到的问题步骤 一、安装 Homebrew 如果你还没有安装 Homebrew,首先需要安装它。Homebrew 是 macOS 上的一款包管理工具,它允许你通过简单的命令行指令安装、更新和卸载软件包。; 1, 打开终端(Terminal…...
【52 机器学习 | 基于KNN近邻和随机森林模型对用户转化进行分析与预测】
文章目录 🏳️🌈 1. 导入模块🏳️🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 字段说明2.4 删除重复值2.5 删除空值 🏳️🌈 3. 数据分析-特征分析3.1 年龄及转化率分析3.2 各营销渠道人数及…...
【Linux】Zookeeper 部署
Zookeeper 搭建方式 单机模式:Zookeeper只运行在一台服务器上,适合测试环境伪集群模式:就是在一台物理机上运行多个Zookeeper 实例;集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算…...
配置mysql 主主模式 GTID
文章目录 一、前提二、修改my.cnf主1 10.255.131.9主2 10.255.131.10 三、配置主主3.1 配置主 10.255.131.93.2 配置从 10.255.131.103.3 配置主 10.255.131.103.4 配置从 10.255.131.9 四、验证五、同步问题排查以及恢复5.1 查看同步状态5.2 查看同步是否数据一致性࿰…...
推荐一款多显示器屏幕亮度调节工具:Twinkle Tray
Twinkle Tray中文版使您可以轻松管理多台显示器的亮度级别。 尽管 Windows 10 能够调节大多数显示器的背光,但它通常不支持外部显示器。 Windows 还缺乏管理多台显示器的亮度的任何功能。 该应用程序将一个新图标插入系统托盘,您可以在其中单击以立即访问…...
第十一章 Shiro会话管理和加密
学习目标 11.1 会话管理11.1.1 会话相关API一、获取会话二、会话属性管理三、会话信息获取四、会话控制五、会话监听六、会话DAO七、会话验证 11.2 缓存一、缓存接口二、内置缓存实现三、配置缓存四、使用缓存五、缓存清理六、注意事项 前面两章我们已经掌握了Shiro四大基石的认…...
DDR4单个DQ仿真实战(一)
目录 引言1、新建Workspace2、导入brd文件3、在SiPro中打开Layout:查看并编辑叠层4、PCB剪裁(可选)5、创建SiPro6、创建分析模型7、查看分析结果8、创建原理图9、系统行为级仿真 引言 DDR4仿真将按照以下几个步骤进行: 新建Work…...
Android Studio插件版本与Gradle 版本对应关系
一、背景 Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能。 虽然 Android 插件通常会与 Android Studio 的更新步调保持一致,但插件(以及 Gradle 系统的其余部分)可…...
Uni-App-01
HBuilder安装卸载 安装 官网地址:https://www.dcloud.io/hbuilderx.html 下载HBuilder最新版 解压到安装目录,路径中不要有中文和空格 在桌面上增加快捷方式 卸载 执行reset.bat 删除HBuilder文件夹(如果提示文件被占用࿰…...
Java版本鸿鹄工程项目管理系统源码概述
项目背景 随着企业规模的扩大和业务的复杂化,传统的工程项目管理方式已经无法满足高效、准确、实时的管理需求。为了提高工程管理效率、优化资源配置、降低风险并控制成本,企业决定通过数字化转型,构建一个基于Spring Cloud、Spring Boot、M…...
基于echarts、php、Mysql开发的数据可视化大屏
大屏效果展示 管理员进入数据可视化页面将看到数据可视化大屏。大屏内容包括两个条形图,用于统计当前网站所有用户的MBTI 16型人格分布;玫瑰图,用于展示当前网站用户MBTI四个维度,八个字母的占比;折线图,用…...
Me-and-My-Girlfriend-1
Me-and-My-Girlfriend-1 解题 信息收集 nmap扫描存活主机 我的虚拟机为131 所以发现130为目标靶机。 查看网站,找到可利用点 使用浏览器查看,使用xff伪造本地用户。 注册用户cat,观察url有url_id,改为5,发现alice用户。 将…...
R语言实现GWAS meta分析(1)
1、基于数据集的Meta分析 datafilenamec("data1.txt","data2.txt"), setwd(workdir) library(Metalgwas) a1 name1c() for(i in datafilename){ assign(paste("file",a,sep""),data.table::fread(paste(getwd(),"/","…...
Kafka-代码示例
一、构建开发环境 File > New > Project 选择一个最简单的模板 项目和坐标命名 配置maven路径 添加maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kaf…...
LLVM - 编译器前端-llvm 基本块、指令、函数 的关系
一:基础概念: 在 LLVM 中,基本块、指令和函数是构建中间表示(IR)的核心概念,它们之间有着紧密的关系,首先了解下基本概念。 1. 基本块(Basic Block) 定义:基本块是一个不包含任何跳转指令的线性代码段,执行顺序是从头到尾。每个基本块至少有一个入口和一个出口。特…...
探索人工智能在自然语言处理中的应用
探索人工智能在自然语言处理中的应用 前言1. 机器翻译2. 情感分析3. 智能客服4. 文本生成未来展望 结语 前言 在信息爆炸的时代,自然语言处理(NLP)作为人工智能(AI)的一个重要分支,正以前所未有的速度改变着…...
IFC模型文本的含义
以下代码是一个STEP文件(ISO-10303-21标准),它是一种用于表示产品数据的国际标准。STEP文件通常用于在不同的计算机辅助设计(CAD)系统之间交换数据。下面是对这段代码的逐行解释: HEADER部分: …...
构建高效评奖系统:SpringBoot在教育领域的应用
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了学生评奖评优管理系统的开发全过程。通过分析学生评奖评优管理系统管理的不足,创建了一个计算机管理学生评奖评优管理系统的方案。文章介绍了学生评奖…...
「二叉树进阶题解:构建、遍历与结构转化全解析」
文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目: 样例: 可以看见,唯一特殊的就…...
在使用代理IP时,需要注意以下几点:
1. 代理IP的质量和稳定性直接影响爬虫的效果。因此,我们需要定期更新代理IP列表,并筛选出可用的代理IP。 2. 有些代理IP可能存在被目标网站封禁的风险。因此,我们需要合理使用代理IP,避免过度频繁地访问目标网站。 3. 在使用代…...
深入理解Java基础概念的高级应用(1/5)
目录 1. Java内存模型:堆、栈与方法区 示例代码:对象存储位置 2. 类加载器的工作原理 示例代码:自定义类加载器 3. JVM如何执行字节码 字节码指令示例 4. Java基础数据类型的存储与操作 自动装箱与拆箱 示例代码:基础类型…...
高可用HA软件
高可用HA(High Availability)软件在分布式系统架构设计中至关重要,它们能够减少系统停机时间,确保应用程序持久、不间断地提供服务。以下是四款常用的高可用HA软件介绍: Keepalived Keepalived起初是为LVS(…...
《近似线性可分支持向量机的原理推导》 拉格朗日函数 公式解析
本文是将文章《近似线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。 公式 9-41 解释: L ( w , b , ξ , α , μ ) 1 2 ∥ w ∥ 2 C ∑ i 1 N ξ i − ∑ i 1 N α i ( y i ( w T x i b ) − ( 1 − ξ …...
9.指针和字符串string类型
指针和字符串string类型 1.指针2.字符串string类型 1.指针 C完全兼容C语言指针,C多出一个this指针 交换两数 #include <iostream>using namespace std;void swap(int *a,int *b){int temp;temp *a;*a *b;*b temp; }int main() {//交换前int a 50;int b …...
八,Linux基础环境搭建(CentOS7)- 安装Mysql和Hive
Linux基础环境搭建(CentOS7)- 安装Mysql和Hive 大家注意以下的环境搭建版本号,如果版本不匹配有可能出现问题! 一、Mysql下载及安装 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Orac…...
海量数据面试题
⭐️前言⭐️ 本篇文章主要针对在面试时可能涉及到的海量数据的面试题,该类型面试题常常考虑通过位图、布隆过滤器或者哈希的方式来解决。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何…...
基于SSM积分商城管理系统的设计与实现(源码+lw+部署文档+讲解等)
前言 伴随着基础网络设施的不断进步和终端电子设备的高度普及,互联网用户规模越来越大。现在人们越来越离不开计算机网络、互联网所带来的好处了,现如今不同的网站系统遍地都是,现在已经不同于以往的传统的管理方式了,只有跟上时代…...
MLP预售开启,革新去中心化通信生态:智能手机与AI Agent齐上阵
2024年10月22日,Matrix Layer Protocol(MLP)宣布其备受期待的第一期产品正式进入预售阶段。随着Web3世界的不断发展,去中心化技术已经深入到我们日常生活的方方面面。作为Web3世界中炙手可热的创新项目,Matrix Layer P…...
长乐住房和城乡建设局网站/站点查询
从ICassFactory为CLSID为{17BCA6E8-A950-497E-B2F9-AF6AA475916F}的COM组件创建实例失败,原因是出现以下错误:c001f011.(Microsoft.Server.manageDTS) 今天在“新建维护计划”时,报错: 创建维护计划失败。其他信息:从 …...
广州建设公司/南宁seo公司哪家好
1 什么是盒模型? 一个页面元素,如:div , 里面内容是文字,图片,或者是另一个标签元素。 padding:内填充,div与他里面装的内容的距离。 martin:外边距,两个div之间的距离…...
为什么做电商网站/如何制作网页
live555源代码简介 liveMedia项目的源代码包括四个基本的库,各种测试代码以及IVE555 Media Server。 四个基本的库分别是UsageEnvironment&TaskScheduler,groupsock,liveMedia,BasicUsageEnvironment。 UsageEnvironment和T…...
wordpress获取文字/免费放单平台无需垫付
1.首先我们来了解什么是异常呢?异常阻止当前方法或作用域继续执行的问题。2.处理异常说到处理异常,我们当然会想到 try catch finally在java中我们会对异常的处理有更高的认识 我们会学习 throw throws等更好的处理异常3.常见异常4.throw关键字ÿ…...
遂宁网站建设/百度指数数据
2007-07-19 20:06tag:正则表达式 批量替换 editplus替换html文件中的非法“<",">”下面的方法将把html文件中类似于<str>的非html标记的尖括号替换掉。例如,将<str>用下面方法替换的结果是:<str>这里只提供了解决问题…...
施工员证怎么查询网站/建网站的详细步骤
JavaScript Cookies 转载自:http://www.w3school.com.cn/js/js_cookies.asp 什么是cookie? cookie 用来识别用户。 cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创…...