【Flask 系统教程 5】视图进阶
类视图
在 Flask 中,除了使用函数视图外,你还可以使用类视图来处理请求。类视图提供了一种更为结构化和面向对象的方式来编写视图函数,使得代码组织更清晰,并且提供了更多的灵活性和可扩展性。
创建类视图
要创建一个类视图,你需要定义一个类,并继承 Flask 提供的视图类之一(如 FlaskView
、MethodView
等)。然后,你可以在这个类中定义 HTTP 请求方法的处理函数,每个函数对应一个 HTTP 请求方法(GET、POST、PUT、DELETE 等)。
下面是一个简单的示例,演示了如何使用类视图处理 GET 请求:
from flask import Flask, request
from flask.views import Viewapp = Flask(__name__)class HelloWorld(View):def dispatch_request(self):return 'Hello, World!'app.add_url_rule('/', view_func=HelloWorld.as_view('hello')) # 设置标识为helloif __name__ == '__main__':app.run(debug=True)
在这个示例中,我们创建了一个名为 HelloWorld
的类,继承了 Flask 提供的 View
类。然后,我们定义了一个名为 dispatch_request
的方法,它处理请求并返回响应。最后,我们使用 as_view
方法将类视图转换为可在路由中使用的视图函数,并将其添加到根路径的路由上。
- 注意
- 必须继承原生类
- 必须且只能使用
app.add_url_rule
方法做视图映射- 必须使用
as_view
把类转化成视图,并设置标识
基于调度方法的类视图
在Flask中,基于调度方法的类视图可以通过继承Flask提供的类视图基类(如flask.views.MethodView
)来实现。每个HTTP请求方法都有对应的类方法(如get()
、post()
、put()
、delete()
等),当接收到对应的HTTP请求时,Flask会自动调用相应的方法来处理请求。
下面是一个简单的示例:
from flask import Flask, request
from flask.views import MethodViewapp = Flask(__name__)class UserAPI(MethodView):def get(self, user_id):# 处理GET请求return f"获取用户 {user_id} 的信息"def post(self):# 处理POST请求data = request.jsonreturn f"创建新用户: {data['name']}"def put(self, user_id):# 处理PUT请求data = request.jsonreturn f"更新用户 {user_id} 的信息为: {data['name']}"def delete(self, user_id):# 处理DELETE请求return f"删除用户 {user_id}"# 将类视图绑定到URL
user_view = UserAPI.as_view('user_api')
app.add_url_rule('/users/', defaults={'user_id': None}, view_func=user_view, methods=['GET', 'POST'])
app.add_url_rule('/users/<int:user_id>', view_func=user_view, methods=['GET', 'PUT', 'DELETE'])if __name__ == '__main__':app.run()
在上面的示例中,我们定义了一个UserAPI
类,继承自MethodView
基类。
每个HTTP请求方法(GET、POST、PUT、DELETE)都对应于类中的一个方法。
然后,我们将这个类视图绑定到了不同的URL,并指定了对应的HTTP请求方法。当客户端发起请求时,Flask会根据请求的方法自动调用相应的方法来处理请求。
defaults
设置变量的默认值methods
指定请求方法
类视图的优势
使用类视图相比于函数视图有一些优势:
- 更好的代码组织:类视图将相似功能的代码组织到一个类中,使得代码更易于维护和管理。
- 支持更多的功能:类视图提供了更多的功能和灵活性,例如可以使用类属性来共享数据,可以通过类方法来实现重复使用的逻辑等。
- 支持类继承:你可以继承已有的类视图,并在子类中进行定制,从而实现代码的复用和扩展。
装饰器/钩子函数
Flask 是一个 Python Web 框架,使用装饰器(decorators)是其核心特性之一。装饰器可以在函数或方法的定义前使用 @
符号,用于修改或者增强函数的功能。在 Flask 中,装饰器通常用于路由的定义,以及在请求处理过程中执行额外的逻辑。
下面是 Flask 中最常见的装饰器及其作用:
@app.route('/')
这是定义路由最常用的装饰器,用于指定 URL 和请求方法与视图函数的关联。例如:
from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'Hello, World!'
当用户访问网站根目录时,Flask 将调用 index
函数来处理请求。
@app.before_request
和 @app.after_request
当您使用 Flask 框架时,@app.before_request
和 @app.after_request
这两个装饰器可以帮助您在请求处理前后执行特定的逻辑。下面是它们的简单示例用法:
from flask import Flask, request, jsonifyapp = Flask(__name__)# 这个函数将在每个请求处理前执行
@app.before_request
def before_request_func():# 在这里你可以执行一些准备工作,比如验证用户身份或记录请求信息print("Before Request")# 这里我们简单地打印请求路径print("Request Path:", request.path)# 这个函数将在每个请求处理后执行
@app.after_request
def after_request_func(response):# 在这里你可以执行一些清理工作或修改响应print("After Request")# 这里我们简单地打印响应状态码print("Response Status Code:", response.status_code)return response# 一个简单的路由,用于演示
@app.route('/')
def index():return jsonify(message="Hello, World!")if __name__ == '__main__':app.run(debug=True)
在上面的示例中,@app.before_request
装饰器用于注册 before_request_func
函数,该函数在每个请求处理前执行。@app.after_request
装饰器用于注册 after_request_func
函数,该函数在每个请求处理后执行。这两个函数可以执行与请求和响应相关的任何操作。
您可以根据需要扩展这些函数,比如添加身份验证、请求日志记录、跨域请求处理等。
@app.errorhandler
当您使用 Flask 框架时,@app.errorhandler
装饰器可以用来处理特定类型的错误。下面是一个简单的示例,演示如何使用 @app.errorhandler
:
from flask import Flask, jsonifyapp = Flask(__name__)# 404 错误处理函数
@app.errorhandler(404)
def not_found_error(error):return jsonify({'error': 'Not found'}), 404# 500 错误处理函数
@app.errorhandler(500)
def internal_server_error(error):return jsonify({'error': 'Internal Server Error'}), 500# 一个简单的路由,用于演示 404 错误
@app.route('/not_found')
def not_found():# 该路由总是返回 404 错误return 'This page does not exist', 404# 一个简单的路由,用于演示 500 错误
@app.route('/internal_server_error')
def internal_server_error_route():# 该路由总是触发 500 错误# 请注意这是一个故意触发错误的示例,实际开发中应该避免这样的代码1 / 0if __name__ == '__main__':app.run(debug=True)
在上面的示例中,我们定义了两个错误处理函数,分别处理 404 和 500 错误。@app.errorhandler(404)
装饰器用于注册 not_found_error
函数,该函数处理 404 错误;@app.errorhandler(500)
装饰器用于注册 internal_server_error
函数,该函数处理 500 错误。
当 Flask 应用收到对应类型的错误时,它将调用相应的错误处理函数,并返回该函数返回的响应给客户端。
需要注意的是,404 错误处理函数会在路由找不到的情况下触发,而 500 错误处理函数会在应用内部发生异常时触发。
在Flask中,钩子函数是一种在请求处理过程中插入自定义代码的机制。Flask提供了一系列钩子函数,允许你在请求处理的不同阶段执行特定的操作。这些钩子函数可以用于执行预处理、后处理、错误处理等任务,以及在请求周期中执行其他自定义逻辑。
以下是一些常用的Flask钩子函数及其应用场景:
@app.before_first_request
- 在处理第一个请求之前执行,通常用于初始化应用的全局状态或加载配置信息。
@app.before_first_request
def initialize_app():# 初始化应用状态print("Initializing the application...")
@app.teardown_request
- 在每个请求处理之后执行,无论是否发生了异常。通常用于执行资源释放或清理操作,例如关闭数据库连接。
@app.teardown_request
def close_db_connection(exception):db.session.close()
@app.context_processor
- 注册一个上下文处理器,可以在模板中访问的变量。这个钩子函数通常用于在所有模板中添加全局变量,例如当前用户或应用配置。
from flask import Flask, render_templateapp = Flask(__name__)# 定义上下文处理器,注入全局变量到模板上下文中
@app.context_processor
def inject_global_variables():# 返回一个字典,包含要注入到模板上下文中的变量return {'global_var_1': 'value_1','global_var_2': 'value_2'}# 定义视图函数,渲染模板
@app.route('/')
def index():return render_template('index.html')if __name__ == '__main__':app.run(debug=True)
在这个示例中,inject_global_variables
函数是一个上下文处理器,它返回一个包含要注入到模板上下文中的变量的字典。
在这个例子中,我们注入了两个全局变量global_var_1
和global_var_2
。
然后,我们在index()
视图函数中渲染了一个模板index.html
,这个模板可以直接访问global_var_1
和global_var_2
这两个全局变量,而无需在视图函数中传递它们。
下面是一个简单的index.html
模板示例,演示了如何在模板中使用上下文处理器注入的全局变量:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Flask Context Processor Example</title>
</head>
<body><h1>Global Variables</h1><p>Global variable 1: {{ global_var_1 }}</p><p>Global variable 2: {{ global_var_2 }}</p>
</body>
</html>
通过使用context_processor
,你可以在Flask应用中方便地注入全局变量到模板中,以便在所有模板中都可以访问到它们。
自定义装饰器
除了 Flask 提供的内置装饰器外,你还可以自定义装饰器来实现特定的功能,例如身份验证、性能监控等。例如,一个简单的自定义装饰器可以用来打印函数的执行时间:
**from flask import Flask
import time
from functools import wrapsapp = Flask(__name__)def timeit(func):@wraps(func)def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f'{func.__name__} executed in {end_time - start_time} seconds')return resultreturn wrapper# 使用 timeit 装饰器测量路由函数执行时间
@app.route('/')
@timeit
def index():# 模拟一个耗时操作time.sleep(1)return "Hello, World!"if __name__ == '__main__':app.run(debug=True)
**
然后你可以将这个装饰器应用到任何你想要监测执行时间的函数上。
主要注意的是,在使用自定义装饰器的时候,一定要放在
@app.route('/')
之后
类视图使用装饰器
以下是一个简单的示例,演示了如何在 Flask 中使用装饰器来扩展类视图的功能:
from flask import Flask, jsonify
from flask.views import MethodViewapp = Flask(__name__)# 装饰器函数,用于验证用户权限
def check_admin_permission(func):def wrapper(*args, **kwargs):# 在这里执行权限验证逻辑# 这里简单地假设有一个名为 `check_admin_permission` 的函数来检查用户权限if check_admin_permission():return func(*args, **kwargs)else:return jsonify({'error': 'Permission denied'}), 403return wrapper# 定义一个类视图
class MyView(MethodView):decorators = [check_admin_permission] # 使用装饰器def get(self):return jsonify({'message': 'GET request processed'})def post(self):return jsonify({'message': 'POST request processed'})# 将类视图添加到路由中
app.add_url_rule('/myview', view_func=MyView.as_view('myview'))if __name__ == '__main__':app.run(debug=True)
在 类视图中使用 decorators
列表属性将该装饰器应用于整个类视图。
蓝图
在 Flask 中,蓝图( Blueprint
)是一种组织和管理应用路由的方式,它可以帮助您将应用拆分为更小的模块,提高代码的可维护性和可扩展性。蓝图允许您将相关的视图、模板和静态文件组织到单独的模块中,并将它们注册到应用中。
蓝图使用
以下是使用蓝图的一般步骤:
-
创建蓝图: 在 Flask 应用中创建一个蓝图对象,通常在一个单独的 Python 模块中定义。
-
定义视图: 在蓝图中定义视图函数,处理特定的 URL 请求。
-
注册蓝图: 在应用对象上注册蓝图,使其生效。
-
使用蓝图: 在应用中使用蓝图定义的路由和视图。
下面是一个简单的示例,演示如何在 Flask 中使用蓝图:
# app/auth/routes.pyfrom flask import Blueprint, render_template# 创建蓝图
auth_bp = Blueprint('auth', __name__)@auth_bp.route('/login')
def login():return render_template('login.html')@auth_bp.route('/register')
def register():return render_template('register.html')
创建蓝图 auth_bp
,并且使用 @blueprint_name.route('/path')
创建该蓝图下的子模块 login
和 register
# app/user/routes.pyfrom flask import Blueprint, render_template# 创建蓝图
user_bp = Blueprint('user', __name__)@user_bp.route('/play')
def play():return render_template('user/play.html')@user_bp.route('/about')
def about():return render_template('user/about.html')
创建蓝图 user_bp
,并且使用 @blueprint_name.route('/path')
创建该蓝图下的子模块 index
和 about
# app/app.pyfrom flask import Flask
from app.auth.routes import auth_bp
from app.main.routes import main_bpapp = Flask(__name__)# 注册蓝图
app.register_blueprint(auth_bp, url_prefix="/auth")
app.register_blueprint(user_bp, url_prefix="/user")if __name__ == '__main__':app.run(debug=True)
- 在上面的示例中,我们创建了两个蓝图,分别是
auth_bp
和main_bp
。每个蓝图都定义了一组路由,分别处理身份验证和主页的请求,然后,我们将这些蓝图注册到应用中,并且使用url_prefix
设置了对应子模块的前缀。 - 例如想要访问
about
则需要访问http://127.0.0.1:5000/user/about
- 这个
url_prefix
是可选的,如果没加前缀则依然是访问http://127.0.0.1:5000/about
通过使用蓝图,我们可以将不同功能的代码模块化,并更好地组织和管理项目代码。
修改蓝图的资源文件夹和模板文件夹
- 创建蓝图的时候,可以使用
template_folder
参数设置当前蓝图使用的模板文件夹- 优先级: 全局
templates
> 当前蓝图templates
- 优先级: 全局
- 创建蓝图的时候,可以使用
static_folder
参数设置当前蓝图使用的资源文件夹- 优先级: 全局
static
> 当前蓝图static
- 优先级: 全局
- 并且非常值得一提的是,当使用了前缀
url_prefix
并且修改了static_folder
的时候,想要引用资源,每个资源文件前面需要拼接前缀! - 创建蓝图的时候,可以使用
static_url_path
参数设置当前蓝图使用的资源文件夹的应用路径,意思是假设资源文件原本放在文件夹user_static
下,但是设置了static_url_path = "u_static"
则需要使用u_static
才能正确访问到资源文件
使用蓝图的项目文件架构
用以上蓝图作为案例
My_project
│
├─.idea
│ │
│ └─...
│
│
├─user
│ __init__.py
│ view.py
│
├─auth
│ __init__.py
│ view.py
│
│
│ app.py
│
├─static
│ ├─css
│ ├─img
│ └─js
├─templates
│ │ index.html
│ │
│ ├─auth
│ │ login.html
│ │ register.html
│ │
│ ├─macros
│ │ macros.html
│ │
│ └─user
│ about.html
│ play.html
│
│
│
└─...
在软件包的__init__.py
中实现创建蓝图
# auth/__init__.py
from flask import Blueprint# 创建蓝图
auth_bp = Blueprint('auth', __name__)from auth import views
在 views.py
中定义路由
# auth/view.py
from flask import render_templatefrom auth import auth_bp@auth_bp.route('/login')
def login():return render_template('auth/login.html')@auth_bp.route('/register')
def register():return render_template('auth/register.html')
在 app.py
中注册蓝图,以及其他的应用配置
# app.py
from flask import Flaskfrom auth import auth_bp
from user import user_bpapp = Flask(__name__)@app.route('/')
def hello_world():return '你好'# 注册蓝图
app.register_blueprint(auth_bp, url_prefix="/auth")
app.register_blueprint(user_bp, url_prefix="/user")if __name__ == '__main__':app.run(debug=True)
通常的做法会在
my_project
根目录下创建一个__init__.py
文件,然后把app.py
的应用主程序放进去,但我的习惯是使用app.py
,读者自由选择。
注意文件结构是为了方便管理,符合规范,个人习惯不同,使用方式也不尽相同,但是大体规范还是要遵守的,有助于代码的组织和维护。
蓝图中使用url_for
函数
from flask import Flask, Blueprint, url_for# 创建 Flask 应用
app = Flask(__name__)# 创建一个蓝图
blueprint = Blueprint('my_blueprint', __name__, url_prefix='/blueprint')# 在蓝图中添加路由
@blueprint.route('/hello')
def hello():return 'Hello from the blueprint!' + "-----------" + url_for('my_blueprint.hello')# 将蓝图注册到应用中
app.register_blueprint(blueprint)# 运行应用
if __name__ == '__main__':app.run(debug=True)
- 效果
在这个例子中,url_for
函数的参数是路由的名称,格式为 <蓝图名称>.<路由名称>
。这样,url_for('my_blueprint.hello')
就会生成蓝图中 /hello
路由的 URL 地址。
此处需要区分 蓝图名称
my_blueprint
和 蓝图对象blueprint
,要使用的是蓝图名称而不是蓝图对象。
蓝图使用子域名
使用子域名(Subdomains)可以使您的 Flask 应用程序在不同的子域名下提供不同的内容或服务。
要在 Flask 中使用子域名,您可以使用 Flask 的 Blueprint
类创建蓝图,并通过 subdomain
参数指定子域名。以下是一个简单的示例:
from flask import Flask, Blueprintapp = Flask(__name__)# 创建蓝图
subdomain_blueprint = Blueprint('subdomain_blueprint', __name__, subdomain='sub')# 将路由添加到蓝图
@subdomain_blueprint.route('/')
def subdomain_home():return 'Hello from the subdomain!'# 将蓝图注册到应用程序
app.register_blueprint(subdomain_blueprint)if __name__ == '__main__':app.run(debug=True)
在这个示例中创建了一个名为 subdomain_blueprint
的蓝图,并将其指定为子域名为 sub
。然后,我们定义了一个路由 /
,在子域名中返回简单的消息。最后,我们通过 app.register_blueprint()
将蓝图注册到应用程序,并指定子域名为 sub
。
现在,当用户访问 http://sub.example.com/
时,将会看到来自子域名的消息。
请注意,在开发环境中,您可能需要将子域名映射到本地主机(例如,在 hosts
文件中),以便在本地测试子域名。
- hosts文件配置
要在本地测试子域名,您可以通过修改操作系统的 hosts 文件来将子域名映射到本地主机。以下是在常见操作系统中修改 hosts 文件的方法:
Windows
- 打开资源管理器,转到以下路径:
C:\Windows\System32\drivers\etc\
- 找到 hosts 文件,并用文本编辑器(如 Notepad)以管理员身份打开。
- 在文件末尾添加一行,格式为
127.0.0.1 sub.example.com
,其中sub.example.com
是您要映射的子域名。 - 保存文件并关闭编辑器。
macOS
- 打开终端应用(可以在应用程序 -> 实用工具中找到)。
- 输入以下命令以编辑 hosts 文件:
sudo nano /etc/hosts
- 输入您的管理员密码并按下 Enter。
- 在文件末尾添加一行,格式为
127.0.0.1 sub.example.com
,其中sub.example.com
是您要映射的子域名。 - 按下
Ctrl + O
保存文件,然后按下 Enter。 - 按下
Ctrl + X
关闭编辑器。
Linux
- 打开终端。
- 输入以下命令以编辑 hosts 文件(您可能需要使用 sudo 提升权限):
sudo nano /etc/hosts
- 输入您的管理员密码(如果需要)并按下 Enter。
- 在文件末尾添加一行,格式为
127.0.0.1 sub.example.com
,其中sub.example.com
是您要映射的子域名。 - 按下
Ctrl + O
保存文件,然后按下 Enter。 - 按下
Ctrl + X
关闭编辑器。
在修改 hosts 文件后,您应该能够在本地访问您设置的子域名,并将其映射到本地主机上的 Flask 应用程序。请注意,这些更改可能需要一些时间才能生效,因此您可能需要清除 DNS 缓存或重启浏览器。
相关文章:

【Flask 系统教程 5】视图进阶
类视图 在 Flask 中,除了使用函数视图外,你还可以使用类视图来处理请求。类视图提供了一种更为结构化和面向对象的方式来编写视图函数,使得代码组织更清晰,并且提供了更多的灵活性和可扩展性。 创建类视图 要创建一个类视图&am…...

代码训练LeetCode(17)存在重复元素
代码训练(17)LeetCode之存在重复元素 Author: Once Day Date: 2024年5月7日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 219. 存在重复元素 II - 力扣(LeetCode)力扣 (LeetCode) 全球…...
运营模型—归因分析(Attribution Analysis)
运营模型—归因分析(Attribution Analysis) 随着互联网技术和业务的发展,广告投放相关的业务也随之兴起。那么广告投放的效果评估也就随之而来。广告的投放一般都是收费模式,所以选中的渠道商的好坏直接和自己的利益挂钩。于是,「归因分析」便最早应用在了广告投放行业。(…...

我必须要吹一波MATLAB 2024a,太牛逼了!|福利:附安装教程及下载地址
最近逛MATLAB官网,发现MATLAB 2024a版本已经Pre-release了,翻了下release note,不得不感叹,实在是太强了! 这次重点更新了四个工具箱: Computer Vision Toolbox Deep Learning Toolbox Instrument Contro…...
XMLHttpRequest与Axios详解
XMLHttpRequest发送请求 在JavaScript中,使用XMLHttpRequest()发送多个参数通常涉及到设置HTTP请求的Content-Type头部,并且将参数作为请求体的一部分发送。以下是一个示例,展示了如何发送包含多个参数的POST请求: var xhr new X…...

【区块链】智能合约简介
智能合约起源 智能合约这个术语至少可以追溯到1995年,是由多产的跨领域法律学者尼克萨博(NickSzabo)提出来的。他在发表在自己的网站的几篇文章中提到了智能合约的理念。他的定义如下:“一个智能合约是一套以数字形式定义的承诺&a…...
上海市计算机学会竞赛平台2024年1月月赛丙组成绩等第
题目描述 给定一个在 00 到 100100 之间的整数 𝑎a,请将它转成等第,规则如下: 9090 或以上为 A8080 或以上为 B7070 或以上为 C6060 或以上为 D5959 或以下为 F 输入格式 单个数字表示 𝑎a 输出格式 单个字符表示…...
【算法入门教育赛2】C.曼哈顿种类 C++题解与代码
比赛地址:https://www.starrycoding.com/contest/6 题目描述 牢 e e e知道在武汉有 n n n家自助店,第 i i i个自助店用坐标 ( x i , y i ) (x_i, y_i) (xi,yi)表示,因为武汉的街道都是互相垂直的,现在他想知道所有自助店之间…...
Electron使用 SQLite
在客户端开发中,无论是 PC 端,还是手机端,为了能够访问离线数据,数据经常需要保存到本地,IndexDB 可以用于存储本地数据,IndexDB 是一个对象存储,数据是以 key:value 的形式进行存储和访问的&am…...

怎样的跨网软件,可以实现网间数据的安全收发?
网络隔离已是较为常见的网络安全保护措施,比如防火墙、网闸、VLAN,云桌面虚拟环境等方面进行隔离。像一些科技研发型企业,不仅仅是内外网隔离,甚至还划分办公网、研发网、测试网、生产网等,防止研发资料、设计资料等敏…...

Sora惊艳亮相:AI技术掀起创作革命,影视产业迎来新风貌!
Sora平台近期发布了名为"Sora首次印象"的更新,为用户带来了令人瞩目的变化。该更新不仅展示了Sora平台的发展方向,还介绍了其在电影制作、广告宣传等领域的潜在应用。 同时,Sora的首席执行官Sam Altman与好莱坞影视工作室进行了会…...

Mac电脑安装打开APP显示问题已损坏 问题解决
当MAC电脑安装完软件打开时,显示文件已损坏,无法打开。搜了很多教程终于找到解决方案,记录下方便以后再用。 我的mac电脑是intel芯片的,如果你遇到这个问题,可以参考我的这个方案。 1.首先当打开软件后出现 “xx软件已…...

AI 数据观 | TapData Cloud + MongoDB Atlas:大模型与 RAG 技术有机结合,落地实时工单处理智能化解决方案
本篇为「AI 数据观」系列文章第二弹,在这里,我们将进一步探讨 AI 行业的数据价值。以 RAG 的智能工单应用场景为例,共同探索如何使用 Tapdata Cloud MongoDB Atlas 实现具备实时更新能力的向量数据库,为企业工单处理的智能化和自…...

Vulnhub靶机随笔-Hacksudo_Aliens
Vulnhub靶机Hacksudo_Aliens详解 攻击机Kali IP:192.168.3.44 靶机 IP:未知 系统:未知 A.信息收集 扫描靶机存活性 确定IP地址 1.命令:arp-scan -l 扫描靶机开放端口及其服务版本信息 2.命令 nmap -A -p- -sV 靶机IP地址 靶机开放三个端口,22ssh端口,80web端…...

抖店选品都怎么选品?什么样的产品更吸引人,更具有购买力?
大家好,我是电商花花。 抖店选品一直都是我们无货源商家的核心问题,不管是出单、还是爆单,店铺想要有销量的前提下都是选品。 很多人一上来就是就是选品,没有选品经验还瞎选品,结果到最后选了一堆出单的产品…...

将来会是Python、Java、Golang三足鼎立吗?
在开始前我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 软件工程里没有银弹ÿ…...

Java入门基础学习笔记16——运算符
package cn.ensource.operator;public class OperatorDemo1 {public static void main(String[] args) {// 目标:掌握基本的算术运算符的使用int a 10;int b 2;System.out.println(a b);System.out.println(a - b);System.out.println(a * b); // 20System.out.…...
golang中三种线程安全的MAP
一、map 是什么 map 是 Go 中用于存储 key-value 关系数据的数据结构,类似 C 中的 map,Python 中的 dict。Go 中 map 的使用很简单,但是对于初学者,经常会犯两个错误:没有初始化,并发读写。 1、未初始化的…...

C++笔试强训day16
目录 1.字符串替换 2.神奇数 3.DNA序列 1.字符串替换 链接 简单的遍历替换即可: class Solution { public:string formatString(string str, vector<char>& arg) {string ret;int k 0;for (int i 0; i < str.size(); i){if (str[i] %){ret arg…...

spsr 的恢复出错,导致 thumb 指令集的 it 条件运行指令运行异常,清晰的调试思路帮助快速解决问题
记一次调试过程 这是一个在 arm 架构上的 RTOS 上的调试过程。问题现象为使用 thumb 指令集的 libgcc 库的情况下,浮点运算随机出错。经过一番追踪调试,逐步缩小问题范围,最后定位问题,成功解决。 场景 在某款的国产 RTOS 上&a…...

windows命令行面板升级Git版本
Date: 2025-06-05 11:41:56 author: lijianzhan Git 是一个 分布式版本控制系统 (DVCS),由 Linux 之父 Linus Torvalds 于 2005 年开发,用于管理 Linux 内核开发。它彻底改变了代码协作和版本管理的方式,现已成为软件开发的事实标准工具&…...

毕设 基于机器视觉的驾驶疲劳检测系统(源码+论文)
文章目录 0 前言1 项目运行效果2 课题背景3 Dlib人脸检测与特征提取3.1 简介3.2 Dlib优点 4 疲劳检测算法4.1 眼睛检测算法4.2 打哈欠检测算法4.3 点头检测算法 5 PyQt55.1 简介5.2相关界面代码 6 最后 0 前言 🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升…...
复制与图片文件同名的标签文件到目标路径
引言:在数据集构建中,我们经常需要挑选一些特殊类型的图片(如:零件中有特殊脏污背景的图片,写论文的时候想单独对这类情况进行热力图验证)。我们把挑选出来的图片放到一个文件夹下,这时候我想快…...
Windows 系统安装 Redis 详细教程
Windows 系统安装 Redis 详细教程 一、Redis 简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值存储系统,常被用作数据库、缓存和消息中间件。相比传统数据库,Redis 具有以下优势: 超高性能…...

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录
【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录 前言 我为什么要写这个篇文章 总结设计经验生成设计模板方便后期快速搭建 一个几张表 一共5张表; 分别是: 订单主表:jjy_orderMain订单产…...
C#提取CAN ASC文件时间戳:实现与性能优化
C#提取CAN ASC文件时间戳:实现与性能优化 在汽车电子和工业控制领域,CAN总线是最常用的通信协议之一。而ASC(ASCII)文件作为CAN总线数据的标准日志格式,广泛应用于数据记录和分析场景。本文将深入探讨如何高效地从CAN…...
onSaveInstanceState() 和 ViewModel 在数据保存能力差异
一、设计目标差异 维度onSaveInstanceState()ViewModel核心目的保存 瞬态 UI 状态(如用户输入、滚动位置),应对进程意外终止或配置变更。管理 业务逻辑相关数据,在配置变更时保留数据࿰…...
c#bitconverter操作,不同变量类型转byte数组
缘起:串口数据传输的基础是byte数组,write(buff,0,num)或者writeline(string),如果是字符串传输就是string变量就可以了,但是在modbus这类hex传递时,就要遇到转换了,拼凑byte数组时需要各种变量的值传递,解…...

全生命周期的智慧城市管理
前言 全生命周期的智慧城市管理。未来,城市将在 实现从基础设施建设、日常运营到数据管理的 全生命周期统筹。这将避免过去智慧城市建设 中出现的“碎片化”问题,实现资源的高效配 置和项目的协调发展。城市管理者将运用先进 的信息技术,如物…...

VScode打开后一直显示正在重新激活终端 问题的解决方法
一、问题 本人打开“.py”文件后,同时会出现以下两个问题。 1、VScode一直循环在”正在重新激活终端“ 2、日志显示intellicode报错: Sorry, something went wrong activating IntelliCode support for Python. Please check the “Python” and “VS I…...