Flask 学习笔记 总结

python基础

服务端开发编程

第一个是赋值运算,第二是乘法,最后是一个是幂(即a2)
a = 2
a * 2
a ** 2

Python支持多重赋值:
a, b, c = 2, 3, 4

这句命令相当于:
a = 2
b = 3
c = 4

Python支持对字符串的灵活操作
s = ‘I like python’
s + ’ very much’ #将 s 与’ very much’拼接,得到’I like python very much’
s.split(’ ') #将 s 以空格分割,得到列表[‘I’, ‘like’, ‘python’]

输入 input() 函数

# 获取用户输入
user_input = input("输入你的姓名: ")
# 打印用户输入的内容
print("Hello, " + user_input + "!")# 获取用户输入并转换为整数
age = int(input("几岁啦? "))
# 使用输入的整数值
print("我明年就要 " + str(age + 1) + " 岁啦!")

输出print() 函数

# 打印简单的字符串print("Hello, World!")
# 打印变量
name = "Alice"
print("Hello, " + name + "!")
# 使用格式化字符串
print("Hello, {}!".format(name))
# 使用 f-strings (Python 3.6+)print(f"Hello, {name}!")
# 打印多个参数
print("Hello", name, "Welcome to the Python world!")
# 打印时不换行
print("First line,", end=" ")print("Second line.")

程序基本结构(选择)

if 条件1:语句2
elif 条件3:语句4
else:语句5

程序基本结构(循环)

s,k = 0,0
w h i l e k < 1 0 1 : # 该 循 环 过 程 就 是 求
1+2+3+...+100k = k + 1s = s + k
print s
s = 0
for k in range(101): #该循环过程也是求1+2+3+...+100s = s + k
print s

程序基本结构(in语句)

s = 0
if s in range(4):print(u's在0, 1, 2, 3中')
if s not in range(1, 4, 1):print(u's不在1, 2, 3中')

Python用def来自定义函数:

def add2(x):return x+2
print(add2(1) )#输出结果为3

Python的函数返回值可以是各种形式,比如返回列表,甚至返回多个值:

def add2(x = 0, y = 0): #定义函数,同时定义参数的默认值return [x+2, y+2] #返回值是一个列表
def add3(x, y):return x+3, y+3 #双重返回
a, b = add3(1,2) #此时a=4,b=5

Python支持用lambda对简单的功能定义“行内函数”

f = lambda x : x + 2 #定义函数f(x)=x+2
g = lambda x, y: x + y #定义函数g(x,y)=x+y

在Python 3中,**kwargs 是一个非常有用的功能,它允许你向函数传递任意数量的关键字参数。
这些参数在函数内部作为一个字典来处理,即能够接受任意数量的参数,而不必事先知道这些参数的名称或数量。

def print_kwargs(**kwargs):for key, value in kwargs.items():print(f"{key} = {value}")print_kwargs(name='Alice', age=25, city='New York')

**kwargs 与固定参数结合使用

def print_info(name, **kwargs):print(f"Name: {name}")for key, value in kwargs.items():print(f"{key} = {value}")print_info('Bob', job='Engineer', country='USA')

Python 有四个内建的数据结构,统称为容器(container),可以是数字、字符甚至是列表,或者是它们之间几种的组合:【注意】容器里边的元素类型可以不相同。

  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)
  • Set(集合)

image-20240513233410965

image-20240513233425493

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20240513233507105

image-20240513233518989

image-20240513233532447

image-20240513233541600

异常处理用try和except关键字来实现。当程序执行try块中的代码时,如果发生了异常,程序的执行将立即跳转到except块。except块允许程序对异常做出响应,而不是让程序崩溃。

while True:try:age = int(input("几岁啦? "))break # 如果转换成功,退出循环except ValueError:print("转换出错.")

捕捉多种异常

try:# 可能引发多种异常的代码pass
except TypeError:# 处理TypeError异常pass
except ValueError:# 处理ValueError异常pass
except (ExceptionType1, ExceptionType2) as e:# 同时处理两种异常,并将异常实例赋值给变量 epass
except Exception as e:# 捕获所有非系统退出类的异常pass

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20240513233723341

Jinja2模板

Jinja2模板主要内容

  • 渲染模板、变量
  • 控制语句
  • 模板结构
  • 加载静态文件

Jinja2模板介绍

  • Jinja2 是一个现代的、设计者友好的、仿照 Django 模板的Python 模板语言。
  • 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全
  • Jinja2 需要至少 Python 2.4 版本来运行
  • pip install Jinja2 (安装Jinja2)

两种分隔符

  • 分隔符{% … %}
    • 用于执行诸如 for 循环或赋值的语句
  • 分隔符 {{ … }}
    • 表达式的结果打印到模板上

注释

  • 使用 {# … #} 注释语法

image-20240513234002592

image-20240513234046959

image-20240513234056396

image-20240513234108376

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20240513234128460

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20240513234151101

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20240513234229621

image-20240513234242731

image-20240513234250272

image-20240513234303226

image-20240513234317975

image-20240513234326390

image-20240513234334881

表单

Flask-WTF创建表单的步骤

  1. 定义表单类。决定表单中的一组字段(Field),每个Field都有对象表示,可附属一个或多个验证函数,验证函数用于验证用户提交的数据是否有效。
  2. 定义模板页面。定义HTML表单。
  3. 定义视图函数。视图函数主要是渲染表单,接收用户在表单中填写的数据。
  4. 重定向页面。作为post请求的响应(Post–>重定向–>Get模式)。

WTForms支持的HTMLField类
image-20240520220918924image-20240520220931291

WTForms常用验证器
image-20240520220953361
image-20240520221004626

EX1:“hello,xx”案例改成表单输入xx

定义表单类

image-20240527231945045

定义模板页面

image-20240527232007769

Bootstrap引入

  • 安装flask-bootstrap
  • 在app.py中引入Bootstrap

image-20240520221252408

  • 在模板页中继承bootstrap的母板,并修改母板中定义的content模块

image-20240520221319660

用户会话(session)
若要保存EX1中用户输入的名字,可考虑使用用户会话,即session[‘xx’],其中“xx”为自定义名称

image-20240527232033334

闪现消息(flash函数)
需要让用户知道程序的状态变化,Flask内置了设置提示信息,比并传递到页面显示

image-20240527232059733

image-20240520222133242

数据库连接访问

使用Flask-SQLAlchemy管理数据库

在Flask-SQLAlchemy中,数据库使用URL指定

image-20240527232205539

配置数据库

image-20240527232216823

定义模型

模型表示应用使用的持久化实体,在ORM中,表现为一个Python类,类中的属性对应数据库表中的列

image-20240520222827586

最常用的SQLAlchemy列类型
image-20240527232234595
image-20240527234022733

最常用的SQLAlchemy列的属性选项
【注意】每个模型都定义主键,一般命名为id

image-20240527234038326

关系
关系型数据库使用关系把不同表中的行联系起来,例如,5.1案例中的关系图表示角色和用户之间存在一对多关系,即1个角色可能有多个用户。

image-20240520223019638

常用的SQLAlchemy关系选项

image-20240527234112337

梳理下关系类型

  • 一对多关系(多对一关系)
  • 一对一关系
  • db.relationship()中的uselist选项设置为False
  • 多对多关系
  • 需要第3张关系表(关联表或联结表),后面的课再讨论

数据库操作

  1. 插入行
  2. 修改行
  3. 删除行
  4. 查询行

image-20240520223126920
image-20240520223135293
image-20240520223149751

image-20240520223159200

image-20240520223207430

image-20240520223215336

常用的SQLAlchemy查询过滤器

image-20240527234143640

常用的SQLAlchemy查询执行方法

image-20240527234156831

前后端分离开发

image-20240527234337090

image-20240527234352333

image-20240527234403460

Restful API

image-20240527234416642

image-20240527234434625

image-20240527234442730

image-20240527234451444

image-20240527234501086

image-20240527234508222

客户端异步请求补充

image-20240527234525680

image-20240527234533366

image-20240527234540226

image-20240527234557262

image-20240527234606163

image-20240527234615683

image-20240527234626058

image-20240527234640052

跨域请求

image-20240527234653805

image-20240527234701449

image-20240527234711170

image-20240527234721317

image-20240527234729206

image-20240527234742804

image-20240527234751799

image-20240527234759473

image-20240527234808613

图表应用

image-20240527234845676

image-20240527234852881

image-20240527234859524

image-20240527234907486

image-20240527234916667

image-20240527234925347

image-20240527234935381

文件上传

image-20240527235026404

image-20240527235034431

image-20240527235041687

image-20240527235050484

image-20240527235057790

image-20240527235105062

image-20240527235114014

Flask练习

练习1-1

image-20240602161822423

代码段:

@app.route('/')
def index():name = request.args.get('name', '陌生人')return render_template('index.html', name=name)
<!DOCTYPE html>
<html>
<head><title>Greeting</title>
</head>
<body><h1>你好,{{ name }}</h1>
</body>
</html>

实现效果

image-20240602162035494

练习1-2

image-20240602161839220

image-20240602161845496

代码片段

class User:def __init__(self, name, age, gender, email, interests=None):self.name = nameself.age = ageself.gender = genderself.email = emailself.interests = interests if interests else []@app.route('/user')
def user_view():# 自定义用户属性值user_info = {'name': 'ZhangSan','age': 25,'gender': 'Female','email': 'alice@example.com','interests': ['reading', 'traveling', 'coding']}user = User(**user_info)return render_template('user.html', user=user)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>User Information</title><!-- Bootstrap CSS --><link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body><div class="container mt-5"><div class="row"><div class="col-md-4"><div class="card" style="width: 18rem;"><img class="card-img-top" src="{{ url_for('static', filename='/images/zhangsan.jpg') }}" alt="User image"><div class="card-body"><h5 class="card-title">{{ user.name }}</h5><ul class="list-unstyled"><li><strong>年龄:</strong> {{ user.age }}</li><li><strong>性别:</strong> {{ user.gender }}</li><li><strong>EMail:</strong> {{ user.email }}</li><li><strong>兴趣:</strong> {{ ', '.join(user.interests) }}</li></ul><a href="#" class="btn btn-primary">联系我们</a></div></div></div><div class="col-md-4"><div class="card" style="width: 18rem;"><img class="card-img-top" src="{{ url_for('static', filename='/images/zhangsan.jpg') }}" alt="User image"><div class="card-body"><h5 class="card-title">{{ user.name }}</h5><ul class="list-unstyled"><li><strong>年龄:</strong> {{ user.age }}</li><li><strong>性别:</strong> {{ user.gender }}</li><li><strong>EMail:</strong> {{ user.email }}</li><li><strong>兴趣:</strong> {{ ', '.join(user.interests) }}</li></ul><a href="#" class="btn btn-primary">联系我们</a></div></div></div><div class="col-md-4"><div class="card" style="width: 18rem;"><img class="card-img-top" src="{{ url_for('static', filename='/images/zhangsan.jpg') }}" alt="User image"><div class="card-body"><h5 class="card-title">{{ user.name }}</h5><ul class="list-unstyled"><li><strong>年龄:</strong> {{ user.age }}</li><li><strong>性别:</strong> {{ user.gender }}</li><li><strong>EMail:</strong> {{ user.email }}</li><li><strong>兴趣:</strong> {{ ', '.join(user.interests) }}</li></ul><a href="#" class="btn btn-primary">联系我们</a></div></div></div></div></div><!-- Bootstrap JS and dependencies --><script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script><script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

实现效果

image-20240602173737645

练习1-3

image-20240602174154303

代码实现

base.html

html复制代码<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{% block title %}Coffee House{% endblock %}</title><link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"><style>.navbar-dark .navbar-brand {color: #fff;}.navbar-dark .nav-link {color: #fff;}</style>
</head>
<body>{% include '_top.html' %}<div class="container mt-5">{% block content %}{% endblock %}</div>{% include '_footer.html' %}<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script><script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

_top.html

html复制代码<nav class="navbar navbar-expand-lg navbar-dark bg-dark"><a class="navbar-brand" href="#">随缘咖啡屋</a><button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarNav"><ul class="navbar-nav ml-auto"><li class="nav-item"><a class="nav-link" href="#">Login</a></li></ul></div>
</nav>

_footer.html

html复制代码<footer class="footer mt-auto py-3 bg-light"><div class="container text-center"><span class="text-muted">copyright© 2024 zjyivi</span></div>
</footer>

user_b.html

{% extends 'base.html' %}{% block title %}王婆说媒{% endblock %}{% block content %}
<div class="text-center my-5"><h1>hi, {{ name }}! 欢迎光临王婆说媒</h1><p>祝你不在家里,就在去相亲的路上~</p>
</div>
<div class="row">{% for i in range(3) %}<div class="col-md-4 mb-4"><div class="card"><img class="card-img-top" src="{{ url_for('static', filename='/images/zhangsan.jpg') }}" alt="User image"><div class="card-body text-center"><h5 class="card-title">{{ user.name }}</h5><ul class="list-unstyled"><li><strong>年龄:</strong> {{ user.age }}</li><li><strong>性别:</strong> {{ user.gender }}</li><li><strong>EMail:</strong> {{ user.email }}</li><li><strong>兴趣:</strong> {{ ', '.join(user.interests) }}</li></ul><a href="#" class="btn btn-primary">联系我们</a></div></div></div>{% endfor %}
</div>
{% endblock %}

app.py新增

@app.route('/user_b')
def user_view_b():user_info = {'name': '张三','age': 18,'gender': '女','email': 'zhangsan@hznu.edu.cn','interests': ['游泳', '跑步', '爬山', '阅读']}user = User(**user_info)name = request.args.get('name', '陌生人')return render_template('user_b.html', user=user, name=name)

实现效果:

image-20240602175410972

练习2

image-20240602175704599

image-20240602175714051

image-20240602175951854

image-20240602180001484

image-20240602180012347

看看表先

image-20240602182855304

一开始连不上

image-20240602185538669

debug是路径问题,这里必须绝对路径

image-20240602185554509

代码实现:

app.py

from flask import Flask, render_template, request, redirect, url_for, session, flash
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, EqualToapp = Flask(__name__)
app.config['SECRET_KEY'] = 'Jay17_2004_06_26'
# 绝对路径
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+os.path.join(basedir,'data.sqlite')
# app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Truedb = SQLAlchemy(app)class User:def __init__(self, name, age, gender, email, interests=None):self.name = nameself.age = ageself.gender = genderself.email = emailself.interests = interests if interests else []@app.route('/')
def index():name = request.args.get('name', '陌生人')return render_template('index.html', name=name)@app.route('/user')
def user_view():# 自定义用户属性值user_info = {'name': 'ZhangSan','age': 25,'gender': 'Female','email': 'alice@example.com','interests': ['reading', 'traveling', 'coding']}user = User(**user_info)return render_template('user.html', user=user)@app.route('/user_b')
def user_view_b():user_info = {'name': '张三','age': 18,'gender': '女','email': 'zhangsan@hznu.edu.cn','interests': ['游泳', '跑步', '爬山', '阅读']}user = User(**user_info)name = request.args.get('name', '陌生人')return render_template('user_b.html', user=user, name=name)class Users(db.Model):  # 确保 Users 继承自 db.Modelid = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(150), unique=True, nullable=False)password = db.Column(db.String(150), nullable=False)class LoginForm(FlaskForm):username = StringField('用户名', validators=[DataRequired(), Length(min=2, max=150)])password = PasswordField('密码', validators=[DataRequired(), Length(min=6, max=150)])submit = SubmitField('登录')class RegistrationForm(FlaskForm):username = StringField('用户名', validators=[DataRequired(), Length(min=2, max=150)])password = PasswordField('密码', validators=[DataRequired(), Length(min=6, max=150)])confirm_password = PasswordField('确认密码', validators=[DataRequired(), EqualTo('password')])submit = SubmitField('注册')@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():user = Users.query.filter_by(username=form.username.data).first()if user and user.password == form.password.data:session['user_id'] = user.idsession['username'] = user.usernamereturn redirect(url_for('profile'))else:flash('登录信息有误!', 'danger')return render_template('login.html', form=form)@app.route('/register', methods=['GET', 'POST'])
def register():form = RegistrationForm()if form.validate_on_submit():if len(form.username.data) < 2:flash('用户名必须至少2位', 'danger')elif len(form.password.data) < 6:flash('密码必须至少6位', 'danger')else:user = Users.query.filter_by(username=form.username.data).first()if user:flash('用户名已注册', 'danger')else:new_user = Users(username=form.username.data, password=form.password.data)db.session.add(new_user)db.session.commit()return redirect(url_for('login'))return render_template('register.html', form=form)@app.route('/profile')
def profile():if 'user_id' not in session:return redirect(url_for('login'))return render_template('profile.html', username=session.get('username'))@app.route('/logout')
def logout():session.clear()return redirect(url_for('login'))if __name__ == '__main__':with app.app_context():db.create_all()  # 创建所有数据库表app.run(debug=False)

_top.html

<nav class="navbar navbar-expand-lg navbar-dark bg-dark"><a class="navbar-brand" href="#">王婆说媒</a><button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarNav"><ul class="navbar-nav ml-auto"><li class="nav-item"><a class="nav-link" href="/login">Login</a></li></ul></div>
</nav>

base_login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{% block title %}My Site{% endblock %}</title><link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>{% include '_top_login.html' %}<div class="container mt-5">{% with messages = get_flashed_messages(with_categories=true) %}{% if messages %}{% for category, message in messages %}<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">{{ message }}<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div>{% endfor %}{% endif %}{% endwith %}{% block content %}{% endblock %}</div>{% include '_footer.html' %}<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script><script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

_top_login.html

<nav class="navbar navbar-expand-lg navbar-dark bg-dark"><a class="navbar-brand" href="/">Web服务端案例</a><button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarNav"><ul class="navbar-nav ml-auto">{% if 'username' in session %}<li class="nav-item"><a class="nav-link" href="{{ url_for('profile') }}">{{ session.username }}</a></li><li class="nav-item"><a class="nav-link" href="{{ url_for('logout') }}">退出登录</a></li>{% else %}<li class="nav-item"><a class="nav-link" href="{{ url_for('login') }}">登录</a></li><li class="nav-item"><a class="nav-link" href="{{ url_for('register') }}">注册</a></li>{% endif %}</ul></div>
</nav>

_footer.html

<footer class="footer mt-auto py-3 bg-light"><div class="container text-center"><span class="text-muted">copyright© 2024 Jay17</span></div>
</footer>

login.html

{% extends 'base_login.html' %}{% block title %}用户登录{% endblock %}{% block content %}
<h2 class="text-center">用户登录</h2>
<form method="POST" action="">{{ form.hidden_tag() }}<div class="form-group">{{ form.username.label() }}{{ form.username(class="form-control") }}</div><div class="form-group">{{ form.password.label() }}{{ form.password(class="form-control") }}</div><div class="form-group">{{ form.submit(class="btn btn-primary") }}</div>
</form>
{% endblock %}

register.html

{% extends 'base_login.html' %}{% block title %}用户注册{% endblock %}{% block content %}
<h2 class="text-center">用户注册</h2>
<form method="POST" action="">{{ form.hidden_tag() }}<div class="form-group">{{ form.username.label() }}{{ form.username(class="form-control") }}</div><div class="form-group">{{ form.password.label() }}{{ form.password(class="form-control") }}</div><div class="form-group">{{ form.confirm_password.label() }}{{ form.confirm_password(class="form-control") }}</div><div class="form-group">{{ form.submit(class="btn btn-primary") }}</div>
</form>
{% endblock %}

profile.html

{% extends 'base_login.html' %}{% block title %}用户中心{% endblock %}{% block content %}
<h2 class="text-center">hello,{{ username }}!</h2>
{% endblock %}

实现效果:

/user_b路由

image-20240602181250127

点击登录跳转至/login路由

image-20240602181307886

登录有误一下先

image-20240602185631049

然后再成功一下

image-20240602185649776

点击退出登录

image-20240602185714107

先注册一个太短的(应该是模板的原因,这边前端就被拦截了,所以就轮不到后端flash了)

image-20240602190133681

再注册一个重复的

image-20240602185929147

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

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

相关文章

redis常用设计模式

Redis常用的设计模式分为读&#xff0c;写&#xff0c;读写三种 一、概要说明 读操作 Read Through Pattern 读穿透 写操作 以Redis统一视图为准&#xff1a;先更新缓存&#xff0c;后更新数据库。 Write Through Pattern 直写模式&#xff08;首先将数据写入缓存&#xf…

51建模网3D编辑器:一键为3D模型设置特殊材质

3D设计师要对3D模型设置玻璃或者钻石材质时&#xff0c;操作比较复杂&#xff0c;但是利用51建模网的3D编辑器&#xff0c;不用下载安装软件&#xff0c;在线通过浏览器即可编辑&#xff0c;具有一键设置特殊材质的功能。目前&#xff0c;它支持钻石材质、玻璃材质和水波纹材质…

Java——基础快速过

1.注释&#xff0c;标识符&#xff0c;关键字 1.1注释 单行注释&#xff1a;// 注释内容&#xff08;用的最多&#xff09; 多行注释&#xff1a;/* 注释内容*/&#xff08;不推荐&#xff09; 文档注释&#xff1a; /** 文档注释 */&#xff08;常见于方法和类之上描述方法和…

分布式任务队列系统 celery 进阶

通过前面的入门&#xff0c;我们大概了解了celery的工作原理及简单的入门代码示例&#xff08;传送门&#xff09;&#xff0c;下面进行一些稍微复杂的任务调度学习 多目录结构异步执行 在实际项目中&#xff0c;使用Celery进行异步任务处理时&#xff0c;经常需要将代码组织…

【面试题】创建两个线程交替打印100以内数字(一个打印偶数一个打印奇数)

阅读导航 一、问题概述二、解决思路三、代码实现四、代码优化 一、问题概述 面试官&#xff1a;C多线程了解吗&#xff1f;你给我写一下&#xff0c;起两个线程交替打印0~100的奇偶数。就是有两个线程&#xff0c;一个线程打印奇数另一个打印偶数&#xff0c;它们交替输出&…

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本&#xff1a;20.10.25 k8s版本&#xff08;kubeadm&#xff0c;kubelet和kubectl&#xff09;&#xff1a;1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …

MySQL的联合索引及案例分析

1. 联合索引 关于联合索引的详解参考博客【Mysql-----联合索引和最左匹配】&#xff0c;包含讲解 最左匹配 联合索引失效的情况 不遵循最左匹配原则范围查询右边失效原理like索引失效原理 比较关注的点在于&#xff1a; 对A、B、C三个字段创建一个联合索引&#xff08;A, …

在线建站流程分析

建站流程是指通过互联网创建一个个人或企业网站的过程。随着互联网的发展&#xff0c;越来越多的人和机构开始意识到网络的重要性&#xff0c;建站成为一种常见的行为。在线建站的流程一般包括以下几个步骤。 首先&#xff0c;选择一个合适的建站平台。目前&#xff0c;有很多在…

前端逆向之查看接口调用栈

一、来源 再分析前端请求接口数据的时候&#xff0c;其中有一个sid不知道是前端如何获取的&#xff0c;一般情况下只需要全局搜搜sid这个字符串或者请求接口的名称就可以了&#xff0c;基本都能找到sid的来源&#xff0c;但是今天这个不一样&#xff0c;搜什么都搜不到 接口地…

面试题------>MySQL!!!

一、连接查询 ①&#xff1a;左连接left join &#xff08;小表在左&#xff0c;大表在右&#xff09; ②&#xff1a;右连接right join&#xff08;小表在右&#xff0c;大表在左&#xff09; 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…

AI论文工具推荐

AI 在学术界的使用情况也比较疯狂&#xff0c;特别是一些美国大学&#xff0c;用 AI 来辅助阅读文献以及辅助写论文的越来越多&#xff0c;毕竟确实可以提高写作效率&#xff0c;特别是在文献综述和初稿生成方面。 但在科研界其实&#xff0c;发现看论文的速度已经赶不上发论文…

“粘土风格”轻松拿捏,基于函数计算部署 ComfyUI实现AI生图

阿里云函数计算 FC 一键部署火爆全球工作流 AI 生图平台—— ComfyUI &#xff0c;实现更高质量的图像生成&#xff0c;三步轻松完成“黏土”创意AI画作&#xff0c;晒图赢眼部按摩器等好礼&#xff01; 活动地址&#xff1a; https://developer.aliyun.com/topic/june/fcspma…

编写备份MySQL 脚本

目录 环境准备 增量备份 增量备份和差异备份 完整代码如下 测试脚本是否正常 星期天运行脚本&#xff08;完全备份&#xff09; 星期一运备份脚本&#xff08;增量备份&#xff09; 星期二备份数据&#xff08;其他天--增量备份&#xff09; 星期三备份数据&#xff08;差异备…

【强烈推荐】四元数与三维旋转

目录 1 强烈推荐讲解四元数与三维旋转的这篇文章&#xff0c;深入浅出2 笔记2.1 复数2.1.1 复数的定义2.1.2 复数的乘法与二维旋转 2.2 三维空间中的旋转2.2.1 角轴2.2.2 旋转的分解 2.3 四元数2.3.1 四元数的定义2.3.2 四元数的乘法2.3.3 四元数与三维旋转2.3.4 三维旋转的矩阵…

数字影像产业园的三大赋能:科技、创新与无限可能

数字影像产业园作为文创产业的重要载体&#xff0c;以科技为核心驱动力&#xff0c;不断推动产业的技术革新和升级。 园区内汇聚了最前沿的数字技术资源&#xff0c;高清摄影设备、虚拟现实技术、人工智能应用等尖端科技在这里得到广泛应用&#xff0c;不仅提升了生产效率&…

能源SCI期刊,中科院4区,审稿快,IF=3.858

一、期刊名称 Frontiers in Energy Research 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;能源 影响因子&#xff1a;3.858 中科院分区&#xff1a;4区 三、期刊征稿范围 能源研究前沿出版了整个领域的严格同行评审研究&#xff0c;重点是可持续和环境…

java多线程原理

1.线程创建与启动&#xff1a;通过继承Thread类或实现Runnable接口创建线程&#xff0c;并调用start()方法启动线程。 1.线程状态&#xff1a;线程在其生命周期中有多种状态&#xff0c;包括新建、运行、阻塞、死亡等。了解这些状态以及如何在它们之间转换对于管理线程至关重要…

ICLR 2024 BACKDOOR FEDERATED LEARNING BY POISONING BACKDOOR-CRITICAL LAYERS

寻找后门攻击最有效的网络层。现有的 FL 攻击和防御方法通常关注整个模型。 他们都没有认识到后门关键&#xff08;BC&#xff09;层的存在——控制模型漏洞的一小部分层。 攻击 BC 层可达到与攻击整个模型相同的效果&#xff0c;但被最先进 (SOTA) 防御检测到的机会要小得多。…

如何卸载360安全卫士

不用像其他教程那么复杂 这篇教程比较友好 1.打开桌面&#xff0c;右键单击快捷方式 选择“打开文件位置” 2.然后&#xff0c;搜uninst.exe 3.运行 4.选择“继续卸载” 5.选择“下一步” 6.选择 “继续卸载” 7.选择“继续卸载” 8.选择“是” 9.静等卸载 10.把卸载程序关…

【因果推断python】16_工具变量2

目录 出生季度和教育对工资的影响 第一阶段 出生季度和教育对工资的影响 到目前为止&#xff0c;我们一直将这些工具视为一些神奇的变量 Z&#xff0c;它们具有仅通过干预变量影响结果的神奇特性。老实说&#xff0c;好的工具变量来之不易&#xff0c;我们不妨将它们视为奇迹…