【Flask 系统教程 5】视图进阶

类视图

在 Flask 中,除了使用函数视图外,你还可以使用类视图来处理请求。类视图提供了一种更为结构化和面向对象的方式来编写视图函数,使得代码组织更清晰,并且提供了更多的灵活性和可扩展性。

创建类视图

要创建一个类视图,你需要定义一个类,并继承 Flask 提供的视图类之一(如 FlaskViewMethodView 等)。然后,你可以在这个类中定义 HTTP 请求方法的处理函数,每个函数对应一个 HTTP 请求方法(GET、POST、PUT、DELETE 等)。

下面是一个简单的示例,演示了如何使用类视图处理 GET 请求:

from flask import Flask, request
from flask.views import View

app = Flask(__name__)

class HelloWorld(View):
    def dispatch_request(self):
        return 'Hello, World!'

app.add_url_rule('/', view_func=HelloWorld.as_view('hello')) # 设置标识为hello

if __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 MethodView

app = Flask(__name__)

class UserAPI(MethodView):
    def get(self, user_id):
        # 处理GET请求
        return f"获取用户 {user_id} 的信息"

    def post(self):
        # 处理POST请求
        data = request.json
        return f"创建新用户: {data['name']}"

    def put(self, user_id):
        # 处理PUT请求
        data = request.json
        return 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 Flask

app = 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, jsonify

app = 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, jsonify

app = 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 / 0

if __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 提供的内置装饰器外,你还可以自定义装饰器来实现特定的功能,例如身份验证、性能监控等。例如,一个简单的自定义装饰器可以用来打印函数的执行时间:

**from flask import Flask
import time
from functools import wraps

app = 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 result
 return 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 MethodView

app = 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'}), 403
    return 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)是一种组织和管理应用路由的方式,它可以帮助您将应用拆分为更小的模块,提高代码的可维护性和可扩展性。蓝图允许您将相关的视图、模板和静态文件组织到单独的模块中,并将它们注册到应用中。

蓝图使用

以下是使用蓝图的一般步骤:

  1. 创建蓝图: 在 Flask 应用中创建一个蓝图对象,通常在一个单独的 Python 模块中定义。

  2. 定义视图: 在蓝图中定义视图函数,处理特定的 URL 请求。

  3. 注册蓝图: 在应用对象上注册蓝图,使其生效。

  4. 使用蓝图: 在应用中使用蓝图定义的路由和视图。

下面是一个简单的示例,演示如何在 Flask 中使用蓝图:

# app/auth/routes.py

from 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.py

from 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.py

from flask import Flask
from app.auth.routes import auth_bp
from app.main.routes import main_bp

app = 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_bpmain_bp。每个蓝图都定义了一组路由,分别处理身份验证和主页的请求,然后,我们将这些蓝图注册到应用中,并且使用 url_prefix设置了对应子模块的前缀。
  • 例如想要访问 about则需要访问 http://127.0.0.1:5000/user/about
  • 这个 url_prefix是可选的,如果没加前缀则依然是访问 http://127.0.0.1:5000/about

通过使用蓝图,我们可以将不同功能的代码模块化,并更好地组织和管理项目代码。


修改蓝图的资源文件夹和模板文件夹

  1. 创建蓝图的时候,可以使用 template_folder参数设置当前蓝图使用的模板文件夹
    • 优先级: 全局 templates > 当前蓝图 templates
  2. 创建蓝图的时候,可以使用 static_folder参数设置当前蓝图使用的资源文件夹
    • 优先级: 全局 static> 当前蓝图 static
  3. 并且非常值得一提的是,当使用了前缀 url_prefix 并且修改了 static_folder 的时候,想要引用资源,每个资源文件前面需要拼接前缀!
  4. 创建蓝图的时候,可以使用 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_template

from 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 Flask

from auth import auth_bp
from user import user_bp

app = 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, Blueprint

app = 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

  1. 打开资源管理器,转到以下路径:C:\Windows\System32\drivers\etc\
  2. 找到 hosts 文件,并用文本编辑器(如 Notepad)以管理员身份打开。
  3. 在文件末尾添加一行,格式为 127.0.0.1 sub.example.com,其中 sub.example.com 是您要映射的子域名。
  4. 保存文件并关闭编辑器。

macOS

  1. 打开终端应用(可以在应用程序 -> 实用工具中找到)。
  2. 输入以下命令以编辑 hosts 文件:sudo nano /etc/hosts
  3. 输入您的管理员密码并按下 Enter。
  4. 在文件末尾添加一行,格式为 127.0.0.1 sub.example.com,其中 sub.example.com 是您要映射的子域名。
  5. 按下 Ctrl + O 保存文件,然后按下 Enter。
  6. 按下 Ctrl + X 关闭编辑器。

Linux

  1. 打开终端。
  2. 输入以下命令以编辑 hosts 文件(您可能需要使用 sudo 提升权限):sudo nano /etc/hosts
  3. 输入您的管理员密码(如果需要)并按下 Enter。
  4. 在文件末尾添加一行,格式为 127.0.0.1 sub.example.com,其中 sub.example.com 是您要映射的子域名。
  5. 按下 Ctrl + O 保存文件,然后按下 Enter。
  6. 按下 Ctrl + X 关闭编辑器。

在修改 hosts 文件后,您应该能够在本地访问您设置的子域名,并将其映射到本地主机上的 Flask 应用程序。请注意,这些更改可能需要一些时间才能生效,因此您可能需要清除 DNS 缓存或重启浏览器。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker高频使用命令

一、Docker常用命令总结 1.镜像命令管理 指令描述ls列出镜像build构建镜像来自Dockerfilehoistory查看历史镜像inspect显示一个或多个镜像的详细信息pull从镜像仓库拉取镜像push推送一个镜像仓库rm移除一个或多个镜像prune一处未使用的镜像&#xff0c;没有被标记或被任何容器…

初始化Linux或者Mac下Docker运行环境

文章目录 1 Mac下安装Docker2 Linux下安装Docker2.1 确定Linux版本2.2 安装Docker2.3 配置加速镜像 3 Docker安装校验4 安装docker-compose4.1 直接下载二进制文件4.2 移动二进制文件到系统路径4.3 设置可执行权限4.4 验证安装 1 Mac下安装Docker mac 安装 docker 还是比较方便…

哥白尼高程Copernicus DEM下载(CSDN_20240505)

哥白尼数字高程模型(Copernicus DEM, COP-DEM)由欧洲航天局(European Space Agency, 简称ESA或欧空局)发布&#xff0c;全球范围免费提供30米和90米分辨率DEM。COP-DEM是数字表面模型(DSM)&#xff0c;它表示地球表面(包括建筑物、基础设施和植被)的高程。COP-DEM是经过编辑的D…

c++set和map

目录 一、set的使用 1、set对象的创建 2、multiset 二、map的使用 1、map对象的创建 2、map的operator[] 序列式容器&#xff1a;vector、list、deque....单纯的存储数据&#xff0c;数据和数据之间没有关联 关联式容器&#xff1a;map、set.....不仅仅是存储数据&#x…

2000-2020年县域创业活跃度数据

2000-2020年县域创业活跃度数据 1、时间&#xff1a;2000-2020年 2、指标&#xff1a;地区名称、年份、行政区划代码、经度、纬度、所属城市、所属省份、年末总人口万人、户籍人口数万人、当年企业注册数目、县域创业活跃度1、县域创业活跃度2、县域创业活跃3 3、来源&#…

python数据可视化:显示两个变量间的关系散点图scatterplot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化&#xff1a; 显示两个变量间的关系 散点图 scatterplot() [太阳]选择题 请问关于以下代码表述错误的选项是&#xff1f; import seaborn as sns import matplotlib.pyplot …

VISO流程图之子流程的使用

子流程的作用 整个流程图的框图多而且大&#xff0c;进行分块&#xff1b;让流程图简洁对于重复使用的流程&#xff0c;可以归结为一个子流程图&#xff0c;方便使用&#xff0c;避免大量的重复性工作&#xff1b; 新建子流程 方法1&#xff1a; 随便布局 框选3 和4 &#…

SQL:NOT IN与NOT EXISTS不等价

在对SQL语句进行性能优化时&#xff0c;经常用到一个技巧是将IN改写成EXISTS&#xff0c;这是等价改写&#xff0c;并没有什么问题。问题在于&#xff0c;将NOT IN改写成NOT EXISTS时&#xff0c;结果未必一样。 目录 一、举例验证二、三值逻辑简述三、附录&#xff1a;用到的S…

3.3Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用-Vue组合式API

为什么要使用Composition API 一个Options API实例 在前面的课程中&#xff0c;我们都是采用 Options API&#xff08;基于选项的 API &#xff09; 来写一个组件的。下面是一个实例&#xff1a; <template> Count is: {{ count }}, doubleCount is: {{ doubleCount…

深入理解网络原理3----TCP核心特性介绍(上)【面试高频考点】

文章目录 前言TCP协议段格式一、确认应答【保证可靠性传输的机制】二、超时重传【保证可靠性传输的机制】三、连接管理机制【保证可靠性传输的机制】3.1建立连接&#xff08;TCP三次握手&#xff09;---经典面试题3.2断开连接&#xff08;四次挥手&#xff09;3.3TCP状态转换 四…

【skill】onedrive的烦人问题

Onedrive的迷惑行为 安装Onedrive&#xff0c;如果勾选了同步&#xff0c;会默认把当前用户的数个文件夹&#xff08;桌面、文档、图片、下载 等等&#xff09;移动到安装时提示的那个文件夹 查看其中的一个文件的路径&#xff1a; 这样一整&#xff0c;原来的文件收到严重影…

政安晨:【Keras机器学习示例演绎】(三十五)—— 使用 LayerScale 的类注意图像变换器

目录 简介 导入 层刻度层 随机深度层 类注意力 会说话的头注意力 前馈网络 其他模块 拼凑碎片&#xff1a;CaiT 模型 定义模型配置 模型实例化 加载预训练模型 推理工具 加载图像 获取预测 关注层可视化 结论 政安晨的个人主页&#xff1a;政安晨 欢迎 &#…

Topaz Video AI 5.0.3激活版 AI视频无损缩放增强

Topaz Video AI专注于很好地完成一些视频增强任务&#xff1a;去隔行&#xff0c;放大和运动插值。我们花了五年时间制作足够强大的人工智能模型&#xff0c;以便在真实世界的镜头上获得自然的结果。 Topaz Video AI 还将充分利用您的现代工作站&#xff0c;因为我们直接与硬件…

【数学建模】矩阵微分方程

一、说明 我相信你们中的许多人都熟悉微分方程&#xff0c;或者至少知道它们。微分方程是数学中最重要的概念之一&#xff0c;也许最著名的微分方程是布莱克-斯科尔斯方程&#xff0c;它控制着任何股票价格。 ​​ 股票价格的布莱克-斯科尔斯模型 微分方程可以由数学中的许多…

MidJourney提示词大全

大家好&#xff0c;我是无界生长。 这篇文章分享一下MidJourney提示词&#xff0c;篇幅内容有限&#xff0c;关注公众号&#xff1a;无界生长&#xff0c;后台回复&#xff1a;“MJ”&#xff0c;获取全部内容。 我是无界生长&#xff0c;如果你觉得我分享的内容对你有帮助&…

ArcGIS软件:地图投影的认识、投影定制

这一篇博客介绍的主要是如何在ArcGIS软件中查看投影数据&#xff0c;如何定制投影。 1.查看地图坐标系、投影数据 首先我们打开COUNTIES.shp数据&#xff08;美国行政区划图&#xff09;&#xff0c;并点击鼠标右键&#xff0c;再点击数据框属性就可以得到以下的界面。 我们从…

【Mac】graphpad prism for Mac(专业医学绘图工具) v10.2.3安装教程

软件介绍 GraphPad Prism for Mac是一款专业的科学数据分析和绘图软件&#xff0c;广泛用于生物医学和科学研究领域。它具有强大的统计分析功能&#xff0c;可以进行各种数据分析&#xff0c;包括描述性统计、生存分析、回归分析、方差分析等。同时&#xff0c;它还提供了丰富…

C++奇迹之旅:string类接口详解(上)

文章目录 &#x1f4dd;为什么学习string类&#xff1f;&#x1f309; C语言中的字符串&#x1f309;string考察 &#x1f320;标准库中的string类&#x1f309;string类的常用接口说明&#x1f320;string类对象的常见构造 &#x1f6a9;总结 &#x1f4dd;为什么学习string类…

FFmpeg学习记录(二)—— ffmpeg多媒体文件处理

1.日志系统 常用的日志级别&#xff1a; AV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_DEBUG #include <stdio.h> #include <libavutil/log.h>int main(int argc, char *argv[]) {av_log_set_level(AV_LOG_DEBUG);av_log(NULL, AV_LOG_DEBUG, "hello worl…

Cisco Nexus Dashboard 3.1(1k) - 云和数据中心网络管理软件

Cisco Nexus Dashboard 3.1(1k) - 云和数据中心网络管理软件 跨数据中心和云实现集中配置、运行和分析。 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-nexus-dashboard/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sys…