2025最新Flask学习笔记(对照Django做解析)
前言:如果还没学Django的同学,可以看Django 教程 | 菜鸟教程,也可以忽略下文所提及的Django内容;另外,由于我们接手的项目大多都是前后端分离的项目,所以本文会跳过对模板的介绍,感兴趣的朋友可以自行查阅其他相关资料;
Flask快速上手
创建项目:
相较于Django而已,Flask的学习比较轻松,在构建视图、路由等方面也是简洁很多,上面代码就是一个简单的接口,可以直接右键当前文件运行:
在浏览器访问http://127.0.0.1:5000 就可以看到输出的内容:
上面代码对应的Django代码如下:
# myapp/views.py
from django.http import HttpResponsedef hello_world(request):return HttpResponse("Hello World")#myapp/urls.pyfrom django.urls import path
from . import viewsurlpatterns = [path('', views.hello_world, name='hello_world'),
]# urls.py
from django.contrib import admin
from django.urls import include, pathurlpatterns = [path('admin/', admin.site.urls),path('', include('myapp.urls')), # 包含myapp的urls
]
Flask路由
Flask中的route()装饰器用于将URL绑定到函数。例如:
@app.route('/hello')
def hello_world():return 'hello world'
在这里,URL '/ hello' 规则绑定到hello_world()函数。
因此,如果用户访问http://localhost:5000/hello ,hello_world()函数的输出将在浏览器中呈现。
另外使用add_url_rule()函数也可用于将URL与函数绑定,如下所示:
def hello_world():return 'hello world'
app.add_url_rule('/nihao', 'hello', hello_world)
以下是 add_url_rule
方法的主要参数说明:
- rule: 这是一个字符串,表示URL规则。例如,'/'代表根路径。
- endpoint (可选): 标识这个URL规则的名称(相当于唯一标识这个视图的名字,因为后续视图多了,有可能出现重名,就可以通过endpoint来标明,类似于Djnago中的路由命名),默认是视图函数的名字。这个值用于反向生成URL,比如通过 url_for() 函数。
- view_func (可选): 一个函数或方法,一旦匹配到相应的URL规则就会被调用执行。这个参数通常是你的视图函数。
跟Django有所不同,Django的路由是通过单独的urls文件注册,如下:
from django.urls import path
from . import viewsurlpatterns = [path('', views.hello_world, name='hello_world'),
]
当你要构建动态URL时,此变量部分标记为<variable-name> 。它作为关键字参数传递给与规则相关联的函数。在以下示例中,route()装饰器的规则参数包含附加到URL '/hello' 的<name>。 因此,如果在浏览器中输入http://localhost:5000/hello/mm作为URL,则'mm'将作为参数提供给 hello()函数。
from flask import Flask
app = Flask(__name__)@app.route('/hello/<name>') #<name>默认的传值类型是字符串类型
def hello_name(name):return 'Hello %s!' % nameif __name__ == '__main__':app.run()
在 Flask 路由中,路径参数 <name> 默认是作为字符串类型处理的。然而,Flask 允许你指定路径参数的转换器(converter),从而可以接受不同类型的值。以下是 Flask 支持的一些内置转换器以及它们对应的类型:
- string: (默认类型)接受任何不包含斜杠的文本,例如 "/hello/world" 中的 "world"。
- int: 接受正整数,并将其作为整数类型传递给视图函数,例如 "/hello/123" 会将 123 作为整数传入。
- float: 接受正浮点数,例如 "/hello/123.45" 会将 123.45 作为浮点数传入。
- path: 类似于 string,但它也接受包含斜杠的文本,例如 "/hello/a/b/c" 可以匹配并传入 "a/b/c"。
- uuid: 接受符合 UUID 格式的字符串,例如 "/hello/6eade98b-7dce-4c62-bf6f-ccbe9cf95bc1"。UUID 是一种标准格式用于定义通用唯一标识符。
- any: 匹配多个预定义的值中的任意一个。你需要提供这些值作为参数,用逗号分隔。例如,<any(abc,def):name> 只接受 "abc" 或 "def" 作为有效的参数值。
使用这些转换器时,只需在路径参数名称前加上转换器名称和冒号,如 <int:id> 或 <float:number>。
Django中构建动态路由的方法:
urlpatterns = [re_path('^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})$',views.index,name='index')
]from django.urls import path,include
urlpatterns = [ path('app01/',include(('app01.urls','app01'),namespace='app01'))]# views.pyt.
def index(request,year,month,day):args = ['2023','12','31']return HttpResponse(resolve(reverse('app01:index',args=args)))
另外,在Flask中使用app.route()注册路由时,默认只支持get方法,要想支持post或其他方法,就得使用method参数说明,如下:
@app.route('/login',methods = ['POST', 'GET'])
def login():if request.method == 'POST':print(1)user = request.form['mm']return redirect(url_for('success',name = user))else:print(2)name = request.args.get("name")return name
这里需要注意的是:request.form()方法是用于获取前端表单POST传过来的数据,而request.args.get()是用于获取请求的各种信息,比如请求方法、GET方法表单数据、URL参数等。例如,在浏览器访问127.0.0.1:5000/login?name=John&age=25&city=New+York,request.args.get("name")获取的值就是John:
补充:Flask中的Request对象重要属性如下所列:
-
Form - 它是一个字典对象,包含表单参数及其值的键和值对。
-
args - 解析查询字符串的内容,它是问号(?)之后的URL的一部分。
-
Cookies - 保存Cookie名称和值的字典对象。
-
files - 与上传文件有关的数据。
-
method - 当前请求方法。
拓展:Flask不像Django一样,Flask的Request对象是通过上下文管理获取的,需要导入使用,如:from flask import request
Url构建
在Flask中,url_for()函数用来构建特定函数的url,有点类似于Django中的reverse()函数;url_for()函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分,如下例子:
from flask import Flask, redirect, url_for
app = Flask(__name__)@app.route('/teacher')
def hello_teacher():return 'Hello teacher'@app.route('/student/<stu_name>')def hello_student(stu_name):return 'Hello %s' % stu_name@app.route('/user/<name>')
def hello_user(name):if name =='teacher':return redirect(url_for('hello_teacher'))else:return redirect(url_for('hello_student', stu_name = name))if __name__ == '__main__':app.run(debug = True)
当运行后,在浏览器中访问127.0.0.1:5000/student/小明
其中“小明”会作为参数传入到hello_user(name)中,经过if判断后,重定向到hello_student(stu_name)函数
这里的url_for('hello_student', stu_name = name)生成的路由是/hello_student/<stu_name>
Django中与之对应的函数是reverse(),用法如下:
reverse通过路由命名或可调用的视图对象来生成相应的路由地址
resolve通过路由地址获取路由对象的信息
from django.http import HttpResponse
from django.shortcuts import render,reverse
from django.urls import resolve#urls.py
from django.urls import path,re_path
from . import views
urlpatterns = [re_path('^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})$',views.index,name='index')
]from django.urls import path,include
urlpatterns = [ path('app01/',include(('app01.urls','app01'),namespace='app01'))]# views.pyt.
def index(request,year,month,day):args = ['2023','12','31']return HttpResponse(resolve(reverse('app01:index',args=args)))#reverse('app01:index',args=args) app01/index/2023/12/31#resolve(reverse('app01:index',args=args))
#ResolverMatch(func=app01.views.index, args=(), kwargs={'year': '2023', 'month': '12', 'day': '31'}, url_name=index, app_names=['app01'], namespaces=['app01'], route=app01/index/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})$)
Cookie/Session
from flask import Flask, make_response, request # 注意需导入 make_responseapp = Flask(__name__)
app.secret_key = 'asdfgsdfsfasdfsdvzfbstrjthgraeg' #记得配上,不然用session的时候会报错@app.route("/set_cookies")
def set_cookie():resp = make_response("success")resp.set_cookie("w3cshool", "w3cshool",max_age=3600)return resp@app.route("/get_cookies")
def get_cookie():cookie_1 = request.cookies.get("w3cshool") # 获取名字为Itcast_1对应cookie的值return cookie_1@app.route("/delete_cookies")
def delete_cookie():resp = make_response("del success")resp.delete_cookie("w3cshool")return resp# 设置session
@app.route("/set_session")
def set_session():session['key'] = 'value' # 在会话中存储数据return 'Session set'# 获取session
@app.route("/get_session")
def get_session():value = session.get('key', 'Not set') # 获取会话中的数据return value# 删除session
@app.route("/delete_session")
def delete_session():session.pop('key', None) # 从会话中删除数据return 'Session deleted'if __name__ == '__main__':app.run(debug=True)
abort()函数
在Flask中,abort
函数用于提前终止请求并返回一个HTTP错误状态码给客户端。它通常用于处理异常情况或错误条件,比如当资源未找到、权限不足等情况下返回相应的HTTP错误码。
abort
函数可以接受一个HTTP状态码作为参数,并且可以选择性地提供一个描述信息或者自定义响应体。Flask会将这个状态码转换为对应的HTTP错误页面。如果想要自定义错误页面的显示内容,可以通过Flask的 errorhandler
装饰器来实现。
下面是一个简单的例子,演示了如何使用 abort
来返回404(Not Found)和403(Forbidden)错误:
from flask import Flask, abortapp = Flask(__name__)@app.route('/resource/<int:resource_id>')
def get_resource(resource_id):if resource_id != 1:# 如果资源ID不是1,则返回404错误abort(404)else:return f'Resource with ID {resource_id}'@app.route('/access/<string:permission>')
def check_access(permission):if permission != 'admin':# 如果权限不是admin,则返回403错误abort(403)else:return 'Access Granted'if __name__ == '__main__':app.run(debug=True)
你还可以通过 errorhandler
装饰器来自定义不同HTTP错误码的错误页面:
from flask import Flask, abort, render_template_stringapp = Flask(__name__)@app.errorhandler(404)
def page_not_found(error):# 自定义404错误页面return render_template_string('<h1>404 - Not Found</h1>'), 404@app.errorhandler(403)
def forbidden(error):# 自定义403错误页面return render_template_string('<h1>403 - Forbidden</h1>'), 403# 前面提到的路由函数
@app.route('/resource/<int:resource_id>')
def get_resource(resource_id):if resource_id != 1:abort(404)else:return f'Resource with ID {resource_id}'@app.route('/access/<string:permission>')
def check_access(permission):if permission != 'admin':abort(403)else:return 'Access Granted'if __name__ == '__main__':app.run(debug=True)
文件上传
在 Flask 中处理文件上传非常简单。它需要一个 HTML 表单,其 enctype
属性设置为“multipart/form-data”
,将文件发布到 URL。
URL 处理程序从 request.files[]
对象中提取文件,并将其保存到所需的位置。
每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。
目标文件的名称可以是硬编码的,也可以从 request.files[file]
对象的 filename
属性中获取。但是,建议使用 secure_filename()
函数获取它的安全版本。
可以在 Flask 对象的配置设置中定义默认上传文件夹的路径和上传文件的最大大小。
app.config['UPLOAD_FOLDER'] 定义上传文件夹的路径
app.config['MAX_CONTENT_LENGTH'] 指定要上传的文件的最大大小(以字节为单位)
先来看个简单的例子:
首先,你需要一个HTML表单让用户可以选择并上传文件。这里是一个使用POST方法和enctype="multipart/form-data"
属性的基本表单示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Upload File</title>
</head>
<body><form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><input type="submit"></form>
</body>
</html>
接下来,在你的Flask应用中,编写处理文件上传的视图函数:
from flask import Flask, request, redirect, url_for, render_template, flash
import os
from werkzeug.utils import secure_filenameapp = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads' # 设置上传文件存放的路径
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 限制文件大小为16MB# 确保保存上传文件目录存在
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)@app.route('/upload', methods=['GET', 'POST'])
def upload_file():if request.method == 'POST':# 检查是否有一个名为file的文件部分if 'file' not in request.files:flash('No file part')return redirect(request.url)file = request.files['file']# 如果用户没有选择文件,则浏览器也会提交一个空的file部分if file.filename == '':flash('No selected file')return redirect(request.url)if file:filename = secure_filename(file.filename) # 安全地获取文件名file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))return redirect(url_for('upload_file', filename=filename))return render_template('upload.html') # 假设你将上面的HTML放在templates/upload.html中if __name__ == '__main__':app.secret_key = 'your_secret_key' # 设置secret key用于flash消息app.run(debug=True)
启动应用,选择文件并上传:
提交后,项目目录下的upload文件夹多了刚刚上传的文件:
数据库操作
由于Flask不直接支持ORM操作,因此需要额外下载扩展。在Flask应用中进行ORM(对象关系映射)操作,最常用的库是SQLAlchemy。SQLAlchemy是一个功能强大的Python SQL工具包和ORM,它允许你以面向对象的方式与数据库交互。
pip install Flask-SQLAlchemy
pip install pymysql
以下是SQLAlchemy的配置以及简单用法
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost/flask_test'
# 禁用追踪修改以节省内存
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb = SQLAlchemy(app)class User(db.Model):__tablename__ = 'user'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 to_dict(self):return {'id': self.id, 'username': self.username, 'email': self.email}@app.route('/add', methods=['POST'])
def add_user():"""添加用户:return: """username = request.json.get('username')email = request.json.get('email')new_user = User(username=username, email=email)db.session.add(new_user)db.session.commit()return jsonify(new_user.to_dict()), 201@app.route('/users', methods=['GET'])
def get_users():"""获取用户:return: """users = User.query.all()return jsonify([user.to_dict() for user in users])@app.route('/user/<int:user_id>', methods=['PUT'])
def update_user(user_id):"""更新用户:return: """user = User.query.get_or_404(user_id)user.email = request.json.get('email')db.session.commit()return jsonify(user.to_dict())@app.route('/user/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):"""删除用户:return: """user = User.query.get_or_404(user_id)db.session.delete(user)db.session.commit()return '', 204if __name__ == '__main__':with app.app_context():db.create_all() # 创建表结构app.run(debug=True)
注意:代码中的db.create_all() 是用来创建表结构的,但是如果当你定义的模型类有所改变,你再次执行db.create_all() 是检测不到的,举个例子:
class User(db.Model):
__tablename__ = 'user'
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)这是你原本的模型代码,当你新增或减少了一个字段,然后你再去执行db.create_all()的时候,此时你的表结构并没有发生什么改变,那么这时候你就得借助第三方的一个扩展:
flask-migrate
pip install flask-migrate
下载之后有三个命令需要执行:
flask db init #只需要运行一次
flask db upgrade #生成迁移脚本,后续有表结构发生改变(或新增表),也要运行一次
flask db migrate #运行迁移脚本,后续表结构发生改变(或新增表),也需要运行一次
Flask-SQLAlchemy高级用法
Flask-SQLAlchemy 提供了强大的 ORM(对象关系映射)功能,可以帮助你更方便地进行数据库操作。除了基本的增删改查操作外,它还支持许多高级用法,如复杂查询、关联查询、事务管理等。以下是一些 Flask-SQLAlchemy 的高级用法示例:
1. 复杂查询
使用 `filter` 和 `filter_by`
- `filter_by` 更适合用于简单的等值匹配查询。
# 查找名字为 'Liming' 的用户
users = User.query.filter_by(name='Liming').all()
- `filter` 提供了更多的灵活性,支持复杂的条件表达式。
# 查找名字为 'Liming' 且邮箱包含 'example.com' 的用户
users = User.query.filter(User.name == 'Liming', User.email.like('%example.com%')).all()
使用 `join` 进行关联查询
假设你有两个模型 `User` 和 `Post`,其中 `Post` 模型有一个外键指向 `User` 模型。
class Post(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(80), nullable=False)body = db.Column(db.Text, nullable=False)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)user = db.relationship('User', backref=db.backref('posts', lazy=True))# 查询所有用户的帖子
results = db.session.query(User, Post).join(Post).all()
for user, post in results:print(user.name, post.title)
2. 分页查询
分页查询在处理大量数据时非常有用。
page = request.args.get('page', 1, type=int)
per_page = 10 # 每页显示的数量
pagination = User.query.paginate(page, per_page, error_out=False)
users = pagination.items
3. 事务管理
使用 `db.session.commit()` 和 `db.session.rollback()` 来手动管理事务。
try:user1 = User(name='John', email='john@example.com')user2 = User(name='Jane', email='jane@example.com')db.session.add_all([user1, user2])db.session.commit()
except:db.session.rollback()raise
4. 使用 `hybrid_property` 创建动态属性
`hybrid_property` 可以让你创建一个既可以作为类方法也可以作为实例属性使用的属性。
from sqlalchemy.ext.hybrid import hybrid_propertyclass User(db.Model):id = db.Column(db.Integer, primary_key=True)first_name = db.Column(db.String(50))last_name = db.Column(db.String(50))@hybrid_propertydef full_name(self):return f"{self.first_name} {self.last_name}"
5. 自定义查询构造器
通过继承 `Query` 类并自定义查询构造器来扩展查询能力。
from flask_sqlalchemy import BaseQueryclass UserQuery(BaseQuery):def search_by_name(self, name):return self.filter(User.name.like(f'%{name}%'))db.Query = UserQuery# 使用自定义的查询构造器
users = User.query.search_by_name('Li').all()
6. 聚合函数
SQLAlchemy 支持多种聚合函数,如 `count`, `sum`, `avg` 等。
from sqlalchemy import func# 计算用户数量
user_count = db.session.query(func.count(User.id)).scalar()# 计算年龄总和
age_sum = db.session.query(func.sum(User.age)).scalar()
这些只是 Flask-SQLAlchemy 高级用法的一部分。根据你的具体需求,还可以探索更多功能,比如事件监听、索引、唯一约束等。掌握这些高级用法可以让你更加高效地构建和维护复杂的数据库应用。
类视图CBV
上面介绍的用法都是基于函数视图的,比如:
@app.route('/hello')
def hello_world():return 'hello world'
这种写法比较简单,但是不利于扩展,下面介绍基于面向对象的方法来实现视图;在 Flask 中,基于类的视图(Class-Based Views)通过 flask.views.View 和 flask.views.MethodView 提供了组织视图逻辑的另一种方式。相比于函数视图,类视图可以更好地支持代码重用、继承和扩展。以下是关于如何使用这些类视图的详细说明:
flask.views.View
from flask import Flask, views, requestapp = Flask(__name__)class MyView(views.View):def dispatch_request(self):return f"Hello, method used: {request.method}"app.add_url_rule('/myview', view_func=MyView.as_view('myview'))if __name__ == '__main__':app.run(debug=True)
添加额外参数
如果你需要向类视图传递一些初始化参数,可以通过 as_view 方法完成。这在需要根据不同上下文初始化视图时非常有用。
class GreetingView(views.View):def __init__(self, greeting_message):self.greeting_message = greeting_messagedef dispatch_request(self):return self.greeting_messagegreeting_view = GreetingView.as_view('greeting_view', greeting_message='Hello, world!')
app.add_url_rule('/greet', view_func=greeting_view)
构建动态路由以及添加装饰器
def log_access(f):@wraps(f)def decorated_function(*args, **kwargs):print("Accessing the view...")return f(*args, **kwargs)return decorated_functionclass GreetingView(MethodView):decorators = [log_access] #添加装饰器def get(self, name=None):print(111)if name:return f"Hello, {name}!"return f"Hello, {name}!"app.add_url_rule('/greet/', defaults={'name': "PMJ"}, view_func=GreetingView.as_view('greet'))
#构建动态路由
app.add_url_rule('/greet/<name>', view_func=GreetingView.as_view('greet_name'))
flask.views.MethodView
from flask import Flask, jsonify, request, viewsapp = Flask(__name__)class UserAPI(views.MethodView):def get(self, user_id):if user_id is None:# 返回用户列表return jsonify([{'id': 1, 'name': 'John Doe'}, {'id': 2, 'name': 'Jane Doe'}])else:# 返回单个用户的详细信息return jsonify({'id': user_id, 'name': 'John Doe'})def post(self):# 创建新用户data = request.get_json()return jsonify({'id': 3, 'name': data['name']}), 201def put(self, user_id):# 更新用户信息data = request.get_json()return jsonify({'id': user_id, 'name': data['name']})def delete(self, user_id):# 删除用户return '', 204# 将 URL 规则和视图类关联起来
user_view = UserAPI.as_view('user_api')# 定义路由规则
app.add_url_rule('/users/', defaults={'user_id': None}, view_func=user_view, methods=['GET'])
app.add_url_rule('/users/', view_func=user_view, methods=['POST'])
app.add_url_rule('/users/<int:user_id>', view_func=user_view, methods=['GET', 'PUT', 'DELETE'])if __name__ == '__main__':app.run(debug=True)
蓝图
Flask中的蓝图类似于Django中的app,都是为了更好的应用解耦,比如一个系统有订单模块、用户模块、商品模块等,就可以将它们分别创建一个蓝图来管理。如下:
文件对应代码:
#Order/views.py#函数视图版本
from flask import Blueprintorder = Blueprint('order', __name__)@order.route('/f1')
def f1():return 'f1'#类视图版本
from flask import Blueprint, viewsorder = Blueprint('order', __name__)class F1View(views.MethodView):def get(self):return 'f1'# 添加 URL 规则
order.add_url_rule('/f1', view_func=F1View.as_view('f1'))
#User/views/py#函数视图版本
from flask import Blueprintuser = Blueprint('user', __name__)@user.route('/f2')
def f2():return 'f2'#类视图版本
from flask import Blueprint, viewsuser = Blueprint('user', __name__)class F2View(views.MethodView):def get(self):return 'f2'# 添加 URL 规则
user.add_url_rule('/f2', view_func=F2View.as_view('f2'))
#lantu/app.pyfrom flask import Flaskfrom lantu.Order.views import order
from lantu.User.views import userdef create_app():app = Flask(__name__)#注册蓝图app.register_blueprint(order, url_prefix='/order')app.register_blueprint(user, url_prefix='/user')return app
#manage.pyfrom lantu.app import create_appif __name__ == '__main__':app = create_app()app.run(debug=True)
启动之后访问:
相关文章:
2025最新Flask学习笔记(对照Django做解析)
前言:如果还没学Django的同学,可以看Django 教程 | 菜鸟教程,也可以忽略下文所提及的Django内容;另外,由于我们接手的项目大多都是前后端分离的项目,所以本文会跳过对模板的介绍,感兴趣的朋友可…...
大模型面试问题准备
1. BERT的多头注意力为什么需要多头? 为了捕捉不同子空间的语义信息,每个头关注不同的方面,增强模型的表达能力 2. 什么是softmax上下溢出问题? 问题描述: 上溢出:ye^x中,如果x取非常大的正数…...
FFmpeg 命令行全解析:高效音视频处理从入门到精通
FFmpeg FFmpeg 是一款开源的多媒体处理工具集,支持音视频编解码、格式转换、流媒体处理等全链路操作。核心功能与工具: 多媒体全链路支持 支持 1000+ 音视频编解码格式(如 H.264、HEVC、AV1)和协议(RTMP、RTSP、HLS),覆盖录制、转码、流化等全流程。提供三大核心工具: …...
在使用LomBok时编译器弹出java: 错误: 不支持发行版本 5该怎么解决的四种方案
你遇到的错误 java: 错误: 不支持发行版本 5 表明你的代码正在尝试使用 Java 5 或更早版本的编译器,而这些版本已经不再受支持,并且可能与你当前使用的 JDK 版本不兼容。以下是解决此问题的步骤: 1. 检查项目语言级别 确保你的项目配置为使…...
【数据结构】(12) 反射、枚举、lambda 表达式
一、反射 1、反射机制定义及作用 反射是允许程序在运行时检查和操作类、方法、属性等的机制,能够动态地获取信息、调用方法等。换句话说,在编写程序时,不需要知道要操作的类的具体信息,而是在程序运行时获取和使用。 2、反射机制…...
在VSCode中安装jupyter跑.ipynb格式文件
个人用vs用的较多,不习惯在浏览器单独打开jupyter,看着不舒服,直接上教程。 1、在你的环境中pip install ipykernel 2、在vscode的插件中安装jupyter扩展 3、安装扩展后,打开一个ipynb文件,并且在页面右上角配置内核 …...
WordPress网站502错误全面排查与解决指南
502 Bad Gateway错误是WordPress站长最常遇到的服务器问题之一,它意味着服务器作为网关或代理时,未能从上游服务器获取有效响应。针对WP可能出现的502问题,本文提供一些基础到进阶的解决方案供大家参考:) 一、502错误的本质和核心诱因 502错误属于HTTP状态码中的5xx系列,…...
锂电池保护板测试仪:电池安全的守护者与创新驱动力
在新能源产业蓬勃发展的今天,锂电池以其高能量密度、长循环寿命和环保特性,成为电动汽车、无人机、便携式电子设备等领域不可或缺的能量来源。然而,锂电池的安全性和稳定性一直是行业关注的焦点。为了确保锂电池在各种应用场景下的可靠运行&a…...
flowable-ui 的会签功能实现
场景:在进行智慧保时通开发时,有个协作合同入围功能,这个功能的流程图里有个评审小组,这个评审小组就需要进行会签操作,会签完成后,需要依据是否有不通过的情况选择下一步走的流程 思考步骤: 首…...
Python学习第十七天之PyTorch保姆级安装
PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网,找到安装指令 5. 验证pytorch是否安装成功 四、…...
Kibana:Spotify Wrapped 第二部分:深入挖掘数据
作者:来自 Elastic Philipp Kahr 我们将比以往更深入地探究你的 Spotify 数据并探索你甚至不知道存在的联系。 在由 Iulia Feroli 撰写的本系列的第一部分中,我们讨论了如何获取 Spotify Wrapped 数据并在 Kibana 中对其进行可视化。在第 2 部分中&#…...
半导体晶圆精控:ethercat转profient网关数据提升制造精度
数据采集系统通过网关连接离子注入机,精细控制半导体晶圆制造过程中的关键参数。 在半导体制造中,晶圆制造设备的精密控制是决定产品性能的关键因素。某半导体工厂采用耐达讯Profinet转EtherCAT协议网关NY-PN-ECATM,将其数据采集系统与离子注…...
CMake小结2(PICO为例)
1 前言 之前写过一篇cmake,不过很简单:CMake小结_cmake ${sources}-CSDN博客 构建系统现在真的太多了,完全学不过来的感觉,meson,gardle,buildroot, Maven。。。我是真的有点放弃治疗了。之前…...
5. Go 方法(结构体的方法成员)
Go语言没有传统的 class ,为了让函数和结构体能够关联,Go引入了“方法”的概念。 当普通函数添加了接收者(receiver)后,就变成了方法。 一、函数和方法示例 // 普通函数 func Check(s string) string {return s }//…...
Linux查看和处理文件内容
1.文本文件 有字符集编码的文件 如:ASCII、UTF-8、Unicode、ANSI等 常见的文本文件 txt、xml、conf、properties、yml等配置文件、日志文 件、源代码 2.二进制文件 除文本文件外的文件 如:可执行程序、图片、音频、视频 3.cat 格式:…...
关于网络端口探测:TCP端口和UDP端口探测区别
网络端口探测是网络安全领域中的一项基础技术,它用于识别目标主机上开放的端口以及运行在这些端口上的服务。这项技术对于网络管理和安全评估至关重要。在网络端口探测中,最常用的两种协议是TCP(传输控制协议)和UDP(用…...
Spring IoC和DI
Spring IoC和DI 1 IOC1.1 什么是IoC?1.2 IoC 介绍1.2.1 传统程序开发1.2.2 问题分析1.2.3 IoC程序开发1.2.3 IoC 优势 1.3 DI 介绍 2. IoC & DI 使⽤IoC 详解Bean的存储1.1 Controller(控制器存储) 1.2 Service(服务存储&…...
centos9之ESXi环境下安装
一、centos9简介 CentOS Stream 9是一个基于RHEL(Red Hat Enterprise Linux)的开源操作系统。它是CentOS Stream系列的最新版本。CentOS Stream是一个中间发行版,位于RHEL和Fedora之间,旨在提供更及时的软件更新和新功能。CentOS …...
【论文学习】基于规模化Transformer模型的低比特率高质量语音编码
以下文章基于所提供的文档内容撰写,旨在对该论文“Scaling Transformers for Low-Bitrate High-Quality Speech Coding”进行较为系统和深入的分析与总结。 论文地址:https://arxiv.org/pdf/2411.19842 一、研究背景与动机 自20世纪70年代以来ÿ…...
Docker 2025/2/24
用来快速构建、运行和管理应用的工具。帮助部署。 快速入门 代码略 解释 docker run :创建并运行一个容器,-d是让容器在后台运行 --name mysql :给容器起个名字,必须唯一 -p 3306:3306 :设置端口映射 -e KEYVALUE :是设置环境变量 mysql :指定运行的…...
Rust语言基础知识详解【一】
1.在windows上安装Rust Windows 上安装 Rust 需要有 C 环境,以下为安装的两种方式: 1. x86_64-pc-windows-msvc(官方推荐) 先安装 Microsoft C Build Tools,勾选安装 C 环境即可。安装时可自行修改缓存路径与安装路…...
Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来
Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来 在深度学习的优化中,自然梯度下降(Natural Gradient Descent)是一个强大的工具,它利用Fisher信息矩阵(FIM)调整梯度…...
Ubutu部署WordPress
前言 什么是word press WordPress是一种使用PHP语言开发的建站系统,用户可以在支持PHP和MySQL数据库的服务器上架设WordPress。它是一个开源的内容管理系统(CMS),允许用户构建动态网站和博客。现在的WordPress已经强大到几乎可以…...
请解释 React 中的 Hooks,何时使用 Hooks 更合适?
一、Hooks 核心理解 1. 什么是 Hooks? Hooks 是 React 16.8 引入的函数式编程范式,允许在函数组件中使用状态管理和生命周期能力。就像给函数组件装上了"智能芯片",让原本只能做简单展示的组件具备了处理复杂逻辑的能力。 2. 类…...
在Linux桌面上创建Idea启动快捷方式
1、在桌面新建idea.desktop vim idea.desktop [Desktop Entry] EncodingUTF-8 NameIntelliJ IDEA CommentIntelliJ IDEA Exec/home/software/idea-2021/bin/idea.sh Icon/home/software/idea-2021/bin/idea.svg Terminalfalse TypeApplication CategoriesApplication;Developm…...
如何在netlify一键部署静态网站
1. 准备你的项目 确保你的静态网站文件(如 HTML、CSS、JavaScript、图片等)都在一个文件夹中。通常,项目结构如下: my-static-site/ ├── index.html ├── styles/ │ └── styles.css └── scripts/└── script.js…...
网页制作09-html,css,javascript初认识のhtml如何使用表单
表单主要用来收集客户端提供的相关信息。,使网页具有交互作用。在网页制作的过程中,常常需要使用表单,如进行会员注册,网上调查和搜索等 访问者可以使用如文本域列表框,复选框以及单选按钮之类的表单对象输入信息,然后…...
Linux 命令大全完整版(03)
1. 系统管理命令 screen 功能说明:多重视窗管理程序。语 法:screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s <shell>][-S <作业名称>]补充说明:screen 为多重视窗管理程序。此处…...
【新人系列】Python 入门专栏合集
✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…...
嵌入式软件数据结构(一)链表知识点专栏 附源码 附原理
嵌入式软件数据结构(一)链表知识点专栏 附源码 附原理 前言: 首先我们要知道什么是链表? 什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指…...
order by布尔盲注、时间盲注
pdo防御下,order by、limit不能参数绑定,可以进行sql注入 案例:靶场的less-46 布尔盲注: import requests from lxml import htmldef get_id_one(URL, paload):res requests.get(urlURL, paramspaload)tree html.fromstring(…...
数据结构与算法-图论-最短路-拓展运用
选择最佳路线 分析: 这是一道图论中的最短路径问题,目标是在给定的公交网络中,找到从琪琪家附近的车站出发,到她朋友家附近车站(编号为 s )的最短时间。以下是对该问题的详细分析: 问题关键信息…...
数据开发的简历及面试
简历 个人信息: 邮箱别写QQ邮箱, 写126邮箱/189邮箱等 学历>>本科及以上写,大专及以下不写 专业>>非计算机专业不写 政治面貌>>党员写, 群众不用写 掌握的技能: 精通 > 熟悉 > 了解 专业工具: 大数据相关的 公司: 如果没有可以写的>>金融服…...
android s下make otapackage编译失败
[DESCRIPTION] android s上,我司推荐使用split build的方式进行编译,但是部分客户依旧会采用AOSP full build的方式进行编译。而我司在这块release的时候,并未进行验证。因此执行make otapackage的时候,会出现如下报错。 [0312/…...
【算法通关村 Day12】字符串
字符串青铜挑战 字符串转换 转换为小写字母 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。leetcode791 public class ToLowerCase {/*** 将字符串中的大写字母转换为小写字母。** param s 输入字符串* return 转换…...
grafana K6压测
文章目录 install and runscript.jsoptions最佳实践 report 解析 https://grafana.com/docs/k6/latest/get-started install and run install # mac brew install k6当前目录下生成压测脚本 # create file script.js k6 new [filename] # create file ‘script.js’ in …...
SQLite 安装教程以及可视化工具介绍
目录 简述 1. Windows 系统安装 1.1 下载预编译的二进制文件 1.2 解压文件 1.3 配置环境变量 1.4 验证安装 2. GUI 可视化工具 2.1 免费工具 2.1.1 DB Browser for SQLite 2.1.2 SQLiteStudio 2.1.3 SQLite Expert 2.1.4 SQLiteGUI 2.1.5 Antares SQL 2.1.6 DbGa…...
谷云科技iPaaS×DeepSeek:构建企业智能集成的核心底座
2025年,DeepSeek大模型的爆发式普及,正引领软件行业实现 “智能跃迁”。从代码生成到系统集成,从企业级应用到消费级产品,自然语言交互能力已成为新一代软件的核心竞争力。据行业分析,超60%的软件企业已启动大模型适配…...
mac 下 java 调用 gurobi 不能加载 jar
在 mac 电脑中的 java 始终不能加载 gurobi 的 jar 包,java 的开发软件 eclipse,idea 总是显示找不到 gurobi 的 jar 包,但是 jar 包明明就在那里。 摸索了三个小时,最后发现原因竟然是: jar 包太新,替换…...
京准电钟:NTP精密时钟服务器在自动化系统中的作用
京准电钟:NTP精密时钟服务器在自动化系统中的作用 京准电钟:NTP精密时钟服务器在自动化系统中的作用 NTP精密时钟服务器在自动化系统中的作用非常重要,特别是在需要高精度时间同步的场景中。NTP能够提供毫秒级的时间同步精度,这…...
京东-零售-数据研发面经【附答案】
近期,有参加春招的同学和我交流了他的面试历程,我针对这些内容进行了细致的总结与梳理,并在此分享出来,希望能助力大家学习与借鉴。 1.八股文 1)HashMap的底层原理是什么【见V6.0面试笔记 Java基础部分第19题】 2&am…...
面试之《react hooks在源码中是怎么实现的?》
要深入理解 React Hooks 在源码中的实现,可以从以下几个关键方面来剖析: 核心数据结构 在 React 内部,使用链表来管理每个函数组件的 Hooks。每个 Hook 对应一个节点,这些节点通过 next 指针相连。以下是简化后的 Hook 节点结构…...
泛型的约束有哪几种?(C#)
目录 1 值类型约束(where T : struct) 2 引用类型约束(where T : class) 3 无参构造函数约束(where T : new ()) 4 基类约束(where T : <基类名>) 5 接口约束(…...
Harmony开发笔记(未完成)
一、感想 作为一名拥有11年经验的Android开发者,我亲历了Android从高速发展到如今面临“僧多粥少”的过程。技术的世界瞬息万变,没有一种技术能够让人依赖一辈子。去年初,我自学了鸿蒙系统,并顺利通过了鸿蒙官方的初级和高级认。…...
DevSecOps普及:安全与开发运维的深度融合
一、引言 随着软件开发模式的演进,DevOps已成为现代软件工程的主流实践。然而,在传统的DevOps流程中,安全往往被视为开发和运维之外的额外环节,导致安全漏洞在产品交付后才被发现,增加了修复成本和风险。为了解决这一…...
JavaScript 系列之:Ajax、Promise、Axios
前言 同步:会阻塞。同步代码按照编写的顺序逐行依次执行,只有当前的任务完成后,才会执行下一个任务。 异步:异步代码不会阻塞后续代码的执行。当遇到异步操作时,JavaScript 会将该操作放入任务队列中,继续…...
為什麼使用不限量動態住宅IP採集數據?
在瞭解“不限量動態住宅IP數據採集”之前,我們需要先搞清楚什麼是“動態住宅IP”。簡單來說,動態IP是一種會定期變化的IP地址,通常由互聯網服務提供商(ISP)分配給家庭用戶。與固定IP(靜態IP)不同…...
vue3-06vue2(Object.defineProperty)与vue3(基于ES6的Proxy)的响应式原理对比
1.vue2响应原理 1.1对于对象与数组 对象类型: 通过 object.defineProperty() 对属性的读取、修改进行拦截 (数据劫持) 数组类型:通过重写更新数组的一系列方法来实现拦截。 (对数组的变更方法进行了包裹) Vue2的响应式是基于Object.defineProperty实现的 1.2 基本原理Objec…...
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 4
第04章_逻辑架构 1. 逻辑架构剖析 首先MySQL是典型的C/S架构,即Client/Server架构,服务器端程序使用的mysqld。 不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本&…...
清华大学DeepSeek文档下载,清华大学deepseek下载(完成版下载)
文章目录 前言一、清华大学DeepSeek使用手册下载二、清华大学DeepSeek使用手册思维导图 前言 这是一篇关于清华大学deepseek使用手册pdf的介绍性文章,主要介绍了DeepSeek的定义、功能、使用方法以及如何通过提示语设计优化AI性能。以下是对这些核心内容的简要概述&…...