【Flask从入门到精通:第九课:数据库基本操作、数据表操作以及数据操作】

数据库操作

数据库驱动(drivers)模块:pymysql、MySQLDB

数据库基本操作

  • 在SQLAlchemy中,添加、修改、删除操作,均由数据库会话(sessionSM)管理。
    • 会话用 db.session 表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 db.commit() 方法提交会话。
  • 在SQLAlchemy 中,查询操作是通过 query 对象操作数据。
    • 最基本的查询是返回表中所有数据,也可以通过filter过滤器进行更精确的数据库查询。

模型类定义

我们后面会把模型创建到单独的文件中,但是现在我们先把模型类写在main.py文件中。

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
class Config(object):DEBUG = True# 数据库链接配置 = 数据库名称://登录账号:登录密码@数据库主机IP:数据库访问端口/数据库名称?charset=编码类型SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/flaskdemo?charset=utf8mb4"# 动态追踪修改设置,如未设置只会提示警告SQLALCHEMY_TRACK_MODIFICATIONS = False# ORM运行时会显示ORM生成的原始SQL语句[调试]SQLALCHEMY_ECHO = Trueapp.config.from_object(Config)"""模型类定义"""
db = SQLAlchemy(app=app)
# 等同于
# db = SQLAlchemy()
# db.init_app(app) # 加载配置并完成初始化过程class Student(db.Model):"""学生信息模型"""# 声明与当前模型绑定的数据表名称__tablename__ = "tb_student""""# 企业中,往往大部分的公司会出现以下2种不同的数据库开发情况。# 1. 企业中有DBA,DBA会提前创建数据库和项目中具体业务的数据表。也就是说我们不需要自己手动建库建表,只需要根据数据库表结构,使用python声明对应的模型与之匹配,就可以操作数据库了。# 2. 企业没有DBA,比较坑爹:#    2.1 开发人员,自己手撸SQL语句,手动建库建表。#    2.2 开发人员,编写模型,使用数据迁移,手动建库和数据迁移建表。# 原生SQL语句create table db_student(id int primary key auto_increment comment "主键",name varchar(15) comment "姓名",age smallint comment "年龄",sex tinyint default 1 comment "性别",email varchar(128) comment "邮箱地址",money NUMERIC(10,2) default 0.0 comment "钱包",key (name),unique key (email));# 字段根据SQL语句来声明"""id = db.Column(db.Integer, primary_key=True,comment="主键")name = db.Column(db.String(15), index=True, comment="姓名")age = db.Column(db.SmallInteger, comment="年龄")sex = db.Column(db.Boolean, default=True, comment="性别")email = db.Column(db.String(128), unique=True, comment="邮箱地址")money = db.Column(db.Numeric(10,2), default=0.0, comment="钱包")def __repr__(self): # 相当于django的__str__return f"{self.name}<{self.__class__.__name__}>"# 所有的模型必须直接或间接继承于db.Model
class Course(db.Model):"""课程数据模型"""__tablename__ = "db_course""""# 原生SQL语句create table db_course (id int primary key auto_increment comment "主键",name varchar(64) comment "课程",price NUMERIC(7,2) comment "价格",unique (name));# 字段根据SQL语句来声明"""id = db.Column(db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(64), unique=True, comment="课程")price = db.Column(db.Numeric(7, 2), comment="价格")# repr()方法类似于django的__str__,用于打印模型对象时显示的字符串信息def __repr__(self):return f"{self.name}<{self.__class__.__name__}>"class Teacher(db.Model):"""老师数据模型"""__tablename__ = "db_teacher""""# 原生SQL语句create table db_teacher (id int primary key auto_increment comment "主键",name varchar(64) comment "姓名",option enum("讲师", "助教", "班主任") comment "职位",unique (`name`));# 字段根据SQL语句来声明"""id = db.Column(db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(64), unique=True, comment="姓名")option = db.Column(db.Enum("讲师", "助教", "班主任"), default="讲师")def __repr__(self):return f"{self.name}<{self.__class__.__name__}>"@app.route("/")
def index():return "ok"if __name__ == '__main__':app.run()

数据表操作

创建和删除表

创建表

# 在视图内调用:
@app.route("/create")
def create_table():db.create_all() # 为项目中被识别的所有模型创建数据表return "ok"# 在视图以外的地方调用:with app.app_context():# create_all()方法执行的时候,需要放在模型的后面# 检测数据库中是否存在和模型匹配的数据表。# 如果没有,则根据模型转换的建表语句进行建表。# 如果找到,则不会进行额外处理db.create_all()

删除表

# 在视图内调用:
@app.route("/drop")
def drop_table():db.drop_all()   # 为项目中被识别的所有模型删除数据表return "ok"# 在视图以外的地方调用:with app.app_context():db.drop_all()  # 慎用,很给力的!!这表示删除数据库中所有模型对应的表。

代码:

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()
app = Flask(__name__, template_folder="templates", static_folder="static")# 配置
app.config.update({"DEBUG": True,"SQLALCHEMY_DATABASE_URI": "mysql://root:123@127.0.0.1:3306/flaskdemo?charset=utf8mb4",# 如果使用pymysql,则需要在连接时指定pymysql# "SQLALCHEMY_DATABASE_URI": "mysql+pymysql://root:123@127.0.0.1:3306/flaskdemo?charset=utf8mb4"# 动态追踪修改设置,如未设置只会提示警告,设置False即可"SQLALCHEMY_TRACK_MODIFICATIONS": False,# ORM执行SQL查询时是哦否显示原始SQL语句,debug模式下可以开启"SQLALCHEMY_ECHO": True,
})db.init_app(app)class Student(db.Model):"""学生管理"""__tablename__ = "db_student" # 表名# __abstract__ = True        # 抽象模型,数据迁移/建表的时候,不会认为这是一个模型,也就不会建表,往往用于设置公共模型,保存公共字段"""# 企业中,往往大部分的公司会出现以下2种不同的数据库开发情况。# 1. 企业中有DBA,DBA会提前创建数据库和项目中具体业务的数据表。也就是说我们不需要自己手动建库建表,只需要根据数据库表结构,使用python声明对应的模型与之匹配,就可以操作数据库了。# 2. 企业没有DBA,比较坑爹:#    2.1 开发人员,自己手撸SQL语句,手动建库建表。#    2.2 开发人员,编写模型,使用数据迁移或者ORM提供建表方法,手动建库和数据迁移建表。# 原生SQL语句create table db_student(id int primary key auto_increment comment "主键",name varchar(15) comment "姓名",age smallint comment "年龄",sex tinyint(1) default 1 comment "性别",email varchar(255) comment "邮箱地址",money NUMERIC(10,2) default 0.0 comment "钱包",key (name),unique key (email));# 字段根据SQL语句来声明"""# 属性名 = db.Column(字段类型, 字段列约束选项)# 如果SQL语句中的字段名在python中是关键字/保留字,则建议改写绑定字段名# 属性名 = db.Column("字段名", 字段类型, 字段列约束选项)id = db.Column("student_id", db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(15), index=True, comment="姓名")age = db.Column(db.SmallInteger, comment="年龄")sex = db.Column(db.SmallInteger, comment="性别")email = db.Column(db.String(255), unique=True, comment="邮箱地址")money = db.Column(db.Numeric(10,2), default=0.0, comment="钱包")# repr()方法类似于django的__str__,用于打印模型对象时显示的字符串信息def __repr__(self):return f"{self.name}<{self.__class__.__name__}>"# 所有的模型必须直接或间接继承于db.Model
class Course(db.Model):"""课程数据模型"""__tablename__ = "db_course""""# 原生SQL语句create table db_course (id int primary key auto_increment comment "主键",name varchar(64) comment "课程",price NUMERIC(7,2) comment "价格",unique (name));# 字段根据SQL语句来声明"""id = db.Column(db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(64), unique=True, comment="课程")price = db.Column(db.Numeric(7, 2), comment="价格")# repr()方法类似于django的__str__,用于打印模型对象时显示的字符串信息def __repr__(self):return f"{self.name}<{self.__class__.__name__}>"class Teacher(db.Model):"""老师数据模型"""__tablename__ = "db_teacher""""# 原生SQL语句create table db_teacher (id int primary key auto_increment comment "主键",name varchar(64) comment "姓名",option enum("讲师", "助教", "班主任") comment "职位",unique (`name`));# 字段根据SQL语句来声明"""id = db.Column(db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(64), unique=True, comment="姓名")option = db.Column(db.Enum("讲师", "助教", "班主任"), default="讲师")def __repr__(self):return f"{self.name}<{self.__class__.__name__}>"@app.route("/")
def index():title = "网站首页"return render_template("index.html", **locals())@app.route("/create")
def create_table():db.create_all() # 为项目中被识别的所有模型创建数据表return "ok"@app.route("/drop")
def drop_table():db.drop_all()   # 为项目中被识别的所有模型删除数据表return "ok"if __name__ == '__main__':app.run()

数据操作

添加一条数据

# 添加一条数据
student = Student(name="小明", age=17, email="xiaoming@qq.com", money=100) # 实例化模型对象
db.session.add(student) # 把模型对象添加数据库session会话对象中。db.session是SQLAlchemy中内置的会话管理对象sessionSM的成员
db.session.commit()     # 提交会话# 再次插入一条数据
student2 = Student(name='小红', sex=False, age=13, email="16565666@qq.com", money=600)
db.session.add(student2)
db.session.commit()     # 提交会话

一次插入多条数据

# 1. 先实例化要创建的模型对象
student = Student(name="小红", age=17, email="xiaohong@qq.com", money=200)
# 2. 把实例对象添加到连接会话
db.session.add(student)
# 1. 先实例化要创建的模型对象
student = Student(name="小花", age=16, email="xiaohua@qq.com", money=200)
# 2. 把实例对象添加到连接会话
db.session.add(student)
# 3. 只需要在结束的时候提交事务即可
db.session.commit()
# 1. 先创建的列表要添加的实例化模型对象列表
student_list = [Student(name='wang', email='wang@163.com', age=20),Student(name='zhang', email='zhang@189.com', age=21),Student(name='chen', email='chen@126.com', age=19),Student(name='zhou', email='zhou@163.com', age=18),Student(name='tang', email='tang@163.com', age=16),Student(name='wu', email='wu@gmail.com', age=20),Student(name='qian', email='qian@gmail.com', age=21),Student(name='liu', email='liu@163.com', age=21),Student(name='li', email='li@163.com', age=18),Student(name='sun', email='sun@163.com', age=17),
]# 2. 一次性添加到连接会话中
db.session.add_all(student_list)
db.session.commit()

删除数据

# 方法1[先查询后删除,2条语句完成删除操作]
# 先查询出来
student = Student.query.first()
print(student)
# 再进行删除
db.session.delete(student)
db.session.commit()# 方法2【1条语句完成删除操作,性能更好更高效】     
# 类似乐观锁,在数据改动时添加条件并判断条件成立以后才进行数据操作,这种用法就是乐观锁
Student.query.filter(Student.id == 5).delete()
db.session.commit()"""
悲观锁,是属于数据库中的一种锁机制,但是乐观锁并非真正的数据库锁。
2种锁都是数据库在应对并发操作时,防止出现资源抢夺的,基于不同人生观所实现2种解决方案。
悲观锁的基本使用:>>> 数据库终端开始begin;  -- 开启事务select * from db_student where student_id = 5 for update; -- 添加一把更新锁【悲观锁】....    -- 在事务提交之前,任何第三方连接都不能修改 student_id = 5这条数据 commit; -- 提交事务<<< 数据库终端开始悲观锁的问题:
1. 提前锁定数据,形成串行化,形成阻塞,不利于性能发挥,不适用高并发场景。
2. 悲观锁只能保证数据的一致性,不能保证脏数据的出现乐观锁的出现就是为了解决悲观锁的问题。
举例:双11活动,商城里面id=5的商品的库存=10了,现在我们要基于乐观锁和悲观锁来解决下单过程中,出现的资源抢夺现象,避免出现超卖(商品数量不能为负数)。乐观锁:
---> begin;  开启事务
---> 先查看库存,记录当前库存 num=10
---> 进行下单操作,买6件
---> 付款
---> 扣除库存 update goods set num=num-6 where num=10 and id=5;  # 增加更新条件,判断库存是否还是原来
---> 如果执行成功,则表示没有人抢,购买成功如果执行事变,则表示已经有人先抢购
---> commit;悲观锁:
---> begin; 开启事务
---> 先给id=5的数据,加锁select * from goods where id=5 for update;
---> 进行下单操作,买6件
---> 付款
---> 扣除库存  update goods set num=num-6 where id=5
---> 执行成功解锁
---- commit;  提交事务
"""

更新数据

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()
app = Flask(__name__, template_folder="templates", static_folder="static")# 配置
app.config.update({"DEBUG": True,"SQLALCHEMY_DATABASE_URI": "mysql://root:123@127.0.0.1:3306/flaskdemo?charset=utf8mb4",# 如果使用pymysql,则需要在连接时指定pymysql# "SQLALCHEMY_DATABASE_URI": "mysql+pymysql://root:123@127.0.0.1:3306/flaskdemo?charset=utf8mb4"# 动态追踪修改设置,如未设置只会提示警告,设置False即可"SQLALCHEMY_TRACK_MODIFICATIONS": False,# ORM执行SQL查询时是哦否显示原始SQL语句,debug模式下可以开启"SQLALCHEMY_ECHO": True,
})db.init_app(app)class Student(db.Model):"""学生管理"""__tablename__ = "db_student" # 表名# 属性名 = db.Column(字段类型, 字段列约束选项)# 如果SQL语句中的字段名在python中是关键字/保留字,则建议改写绑定字段名# 属性名 = db.Column("字段名", 字段类型, 字段列约束选项)id = db.Column("student_id", db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(15), index=True, comment="姓名")age = db.Column(db.SmallInteger, comment="年龄")sex = db.Column(db.SmallInteger, comment="性别")email = db.Column(db.String(255), unique=True, comment="邮箱地址")money = db.Column(db.Numeric(10,2), default=0.0, comment="钱包")# repr()方法类似于django的__str__,用于打印模型对象时显示的字符串信息def __repr__(self):return f"{self.name}<{self.__class__.__name__}>"# 所有的模型必须直接或间接继承于db.Model
class Course(db.Model):"""课程数据模型"""__tablename__ = "db_course""""# 原生SQL语句create table db_course (id int primary key auto_increment comment "主键",name varchar(64) comment "课程",price NUMERIC(7,2) comment "价格",unique (name));# 字段根据SQL语句来声明"""id = db.Column(db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(64), unique=True, comment="课程")price = db.Column(db.Numeric(7, 2), comment="价格")# repr()方法类似于django的__str__,用于打印模型对象时显示的字符串信息def __repr__(self):return f"{self.name}<{self.__class__.__name__}>"class Teacher(db.Model):"""老师数据模型"""__tablename__ = "db_teacher""""# 原生SQL语句create table db_teacher (id int primary key auto_increment comment "主键",name varchar(64) comment "姓名",option enum("讲师", "助教", "班主任") comment "职位",unique (`name`));# 字段根据SQL语句来声明"""id = db.Column(db.Integer, primary_key=True, comment="主键")name = db.Column(db.String(64), unique=True, comment="姓名")option = db.Column(db.Enum("讲师", "助教", "班主任"), default="讲师")def __repr__(self):return f"{self.name}<{self.__class__.__name__}>"@app.route("/")
def index():return "ok"@app.route("/create")
def create_table():db.create_all() # 为项目中被识别的所有模型创建数据表return "ok"@app.route("/drop")
def drop_table():db.drop_all()   # 为项目中被识别的所有模型删除数据表return "ok""""一次添加一条数据"""
@app.route("/add")
def add_student():# 1. 先实例化要创建的模型对象student = Student(name="小明", age=17, email="xiaoming@qq.com", money=100)  # 实例化模型对象# 2. 把实例对象添加到连接会话db.session.add(student)# 3. 提交事务db.session.commit()return "ok""""一次添加多条数据"""
@app.route("/madd")
def multi_add():# 1. 先实例化要创建的模型对象student = Student(name="小红", age=17, email="xiaohong@qq.com", money=200)# 2. 把实例对象添加到连接会话db.session.add(student)# 1. 先实例化要创建的模型对象student = Student(name="小花", age=16, email="xiaohua@qq.com", money=200)# 2. 把实例对象添加到连接会话db.session.add(student)# 3. 只需要在结束的时候提交事务即可db.session.commit()return "ok"@app.route("/madd2")
def multi_add2():# 1. 先创建的列表要添加的实例化模型对象列表student_list = [Student(name='wang', email='wang@163.com', age=20),Student(name='zhang', email='zhang@189.com', age=21),Student(name='chen', email='chen@126.com', age=19),Student(name='zhou', email='zhou@163.com', age=18),Student(name='tang', email='tang@163.com', age=16),Student(name='wu', email='wu@gmail.com', age=20),Student(name='qian', email='qian@gmail.com', age=21),Student(name='liu', email='liu@163.com', age=21),Student(name='li', email='li@163.com', age=18),Student(name='sun', email='sun@163.com', age=17),]# 2. 一次性添加到连接会话中db.session.add_all(student_list)db.session.commit()return "ok"@app.route("/del")
def delete_student():"""删除一条数据"""# 先查询出来student = Student.query.first()# student = db.session.query(Student).first()# 再进行删除db.session.delete(student)db.session.commit()return "ok"@app.route("/mdel")
def multi_delete_student():"""按条件删除多条数据"""Student.query.filter(Student.id > 5).delete()# db.session.query(Student).filter(Student.id > 5).delete()db.session.commit()return "ok"@app.route("/update")
def update():"""更新一条"""# 先查询出来student = Student.query.filter(Student.id == 4).first()student.name = "小白"db.session.commit()return "ok"@app.route("/update2")
def update2():"""直接根据条件更新一条或多条数据"""Student.query.filter(Student.name == 'zhang', Student.money == -99.00).update({'money': 1998})db.session.commit()return "ok"@app.route("/update3")
def update3():# 字段引用[利用当前一条数据的字典值进行辅助操作,实现类似django里面F函数的效果]# 每次自增100Student.query.filter(Student.name == "小花").update({"money": Student.money + 100})db.session.commit()return "ok"@app.route("/update4")
def update4():# 字段引用[利用当前一条数据的字典值进行辅助操作,实现类似django里面F函数的效果]# 在原有money的基础上按age补贴1000*ageStudent.query.filter(Student.name == "zhang").update({"money": Student.money + 1000 * Student.age})db.session.commit()return "ok"if __name__ == '__main__':app.run()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/44524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交易平台Zero Hash现已支持SUI交易

Zero Hash是一家领先的加密货币和稳定币基础设施平台&#xff0c;为包括Stripe、Shift4和Franklin Templeton在内的公司提供支持&#xff0c;现在也支持对SUI的访问。此举使Zero Hash的客户及其终端用户能够使用SUI。 提供API和SDK以及专注于无缝连接法币、加密货币和稳定币的…

读人工智能全传11人工智能会出什么错

1. 人工智能会出什么错 1.1. 一些报道是公正合理的&#xff0c;不过坦白地说&#xff0c;大部分报道都愚蠢得无可救药 1.2. 一些报道颇有知识性和引导性&#xff0c;而大部分则是杞人忧天式的恐吓 1.3. 滑稽的报道迎合了大众对人工智能的“终结者式恐惧” 1.3.1. 我们创造出…

html设计(两种常见的充电效果)

第一种 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

方便快捷传文件—搭建rsync文件传输服务器

比如我们有一个服务器&#xff0c;想把各个机器的文件都通过脚本传给这台机&#xff0c;用sftp或者直接rsync就必须输密码&#xff0c;肯定不行&#xff0c;做等效性免密又麻烦&#xff0c;怎么办呢&#xff0c;这么办&#xff01; 在服务端 yum -y install rsync #编辑&…

Vue3 关于scss预编译中:deep 其中的deep如何理解

在SCSS预处理器中&#xff0c;:deep是一个伪类选择器&#xff0c;用于选择一个元素的所有后代元素&#xff0c;无论它们在DOM结构中的层级深度如何。换句话说&#xff0c;:deep选择器是一个类似于CSS中的后代选择器&#xff0c;但是它可以不考虑嵌套层级的限制&#xff0c;而是…

Android MessageQueue 源码分析

类注释 /*** Low-level class holding the list of messages to be dispatched by a* {link Looper}. Messages are not added directly to a MessageQueue,* but rather through {link Handler} objects associated with the Looper.** <p>You can retrieve the Messa…

【FineGrip】全光学感知:一种新的通用遥感图像解释任务和细粒度数据集(IEEE TGRS 2024)

摘要 目前的遥感解译模型通常集中于单一的任务&#xff0c;如检测、分割或字幕。但是&#xff0c;针对特定任务设计的模型无法实现综合多层次解译。该领域也缺乏多任务联合解译数据集。本文提出Panoptic Perception&#xff0c;一个新的任务和一个新的细粒度数据集&#xff08…

apache Kylin系列介绍及配置

Apache Kylin是一个开源的分布式分析引擎,用于OLAP(联机分析处理)数据处理。它专门设计用于处理大规模的数据集,并提供快速的查询和分析能力。 apache Kylin架构: Apache Kylin是一个开源的分布式分析引擎,旨在提供高性能、低延迟的OLAP(联机分析处理)能力。下面是Ap…

nvim工具介绍

1. **seoul256.vim**: 一个基于首尔色彩的低对比度 Vim 颜色方案&#xff0c;适用于 256 色终端或 GVim。 2. **vim-easy-align**: Vim 插件&#xff0c;用于对齐文本。 3. **vim-go**: Vim 的 Go 语言插件&#xff0c;支持语法高亮、自动缩进等。 4. **coc.nvim**: 集成了 LSP…

GESP CCF C++ 二级认证真题 2024年6月

第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级&#xff0c;那他可以选择的认证语言有几种&#xff1f;&#xff08; &#xff09; A. 1 B. 2 C. 3 D. 4 第 2 题 下面流程图在yr输入2024时&#xff0c;可以判定yr代表闰年&#xff0c;并输出 2月…

介绍一款数据准实时复制(CDC)中间件 `Debezium`

简介 文章开头先介绍一下什么是CDC。数据准实时复制(CDC)是目前行内实时数据需求大量使用的技术。常用的中间件有Canal、Debezium、Flink CDC等 下面我们做一下对比 各有优缺点吧,本主要介绍一下Debezium中间件。 Debezium是什么 Debezium是一个为变更数据捕获(CDC)提供…

Windows图形界面(GUI)-SDK-C/C++ - 列表框(List)

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 列表框(List) 控件样式 创建控件 初始控件 消息处理 示例代码 列表框(List) 控件样式 列表框&#xff08;ListBox&#xff09;是Windows图形界面开发中常用的控件&#xff0c;允许用户从…

力扣第230题“二叉搜索树中第K小的元素”

在本篇文章中&#xff0c;我们将详细解读力扣第230题“二叉搜索树中第K小的元素”。通过学习本篇文章&#xff0c;读者将掌握如何使用中序遍历来找到二叉搜索树中的第K小的元素&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于…

OpenAI终止对中国提供API服务,对国内AI市场产生重大冲击?

6月25日&#xff0c;OpenAI突然宣布终止向包括中国在内的国家地区提供API服务&#xff0c;本月9日这一政策已经正式生效了&#xff01; 有人说&#xff0c;这个事件给中国AI行业带来很大冲击&#xff01;是这样吗&#xff1f;在展开讨论前&#xff0c;我们先来看看什么是API服务…

会话固定攻击

会话固定攻击&#xff08;Session Fixation Attack&#xff09;是一种网络攻击&#xff0c;攻击者试图诱骗受害者使用攻击者指定的会话ID&#xff0c;以便在受害者登录后&#xff0c;攻击者能够窃取受害者的会话并冒充受害者进行操作。下面是一个形象的例子来解释会话固定攻击&…

8080端口映射外网不成功的原因

最近因为需要将群晖nas的8080端口映射到外网&#xff0c;但是路由器已经成功设置&#xff0c;群晖nas上对应端口的服务也已经部署好&#xff0c;可是如论如何也从外网访问不到群晖服务器上&#xff0c;但是同样是5000端口&#xff0c;群晖的外网管理端口就可以&#xff0c;最后…

在linux x86服务器安装jdk

安装JDK&#xff08;Java Development Kit&#xff09;在Linux x86 服务器上可以按照以下步骤进行操作。以下步骤假设你有root权限或者sudo权限。 1. 下载JDK安装包 首先&#xff0c;你需要从Oracle官网或者OpenJDK官网下载JDK的安装包。可以选择对应的版本&#xff0c;比如J…

jmeter-beanshell学习8-for循环

一个稍微有点难度的东西 要把响应结果的所有名字都取出来&#xff0c;然后怎么处理看自己需求。比如找某个人是不是在这里&#xff0c;或者把所有人都写进一个文档&#xff0c;我就不编场景了 第一步想要取出所有名字&#xff0c;还得靠万能的正则表达式提取器&#xff0c;jso…

【开源 Mac 工具推荐之 1】gibMacOS:方便快捷的 macOS 完整包下载 Shell 工具

简介 gibMacOS 是由 GitHub 开发者 corpnewt 编写的一款 Shell 工具。它采用 Python 编程语言&#xff0c;可以让用户打开后在纯文本页面中轻松选择并下载来源于 Apple 官方的 macOS 完整安装包。 Repo 地址&#xff1a;https://github.com/corpnewt/gibMacOS &#xff08;其…

【简历】某电子科技大学:前端实习简历指导,面试通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份一本某电子科技大学的同学简历&#xff0c;投递的职位就是我们前端&#xff0c;但是因为学校是一本&#xff0c;我们说主要主体在…