Python Flask 基础入门第六课: Flask 全局变量 current_app, g 以及 session各自如何使用 有什么差异
全局变量 current_app, g 以及 session
- 全局变量差异汇总表
- current_app
- 章节1 current_app - 当前应用实例
- current_app的基本概念
- current_app的作用
- current_app的使用
- 章节2:current_app的上下文
- 什么是应用上下文?
- current_app与应用上下文的关系
- current_app何时可用,何时不可用?
- g
- 章节1:g - 全局上下文
- g对象的基本概念
- g对象的作用
- 章节2:g对象的使用
- 在视图函数中使用g对象
- 在请求处理函数之外的地方使用g对象
- 章节3:应用上下文和线程安全性
- 应用上下文的生命周期
- g对象的线程安全性
- 章节4:为什么使用g对象?
- 为什么不使用全局变量?
- 常见用例
- 章节5:示例:使用g对象共享数据库连接
- session
- 章节1:会话(Session)的基本概念
- 会话的定义
- 会话与Cookie的关系
- 章节2:会话的作用
- 会话的主要作用
- 章节3:Flask中的会话
- Flask中的会话对象
- 配置会话存储方式
- 章节4:示例:使用会话实现用户登录
- 示例1:用户登录
- 章节5:示例:使用会话实现购物车功能
- 示例2:购物车功能
全局变量差异汇总表
以下是一个表格,用于比较Flask中的session
、g
和current_app
的相同点和不同点:
特性 | session | g (全局上下文) | current_app (应用上下文) |
---|---|---|---|
用途 | 存储和跟踪用户特定数据 | 在请求处理期间共享数据 | 在应用上下文中访问应用配置和对象 |
存储位置 | 默认情况下存储在客户端cookie中,但可配置为其他地方 | 存储在应用上下文中的全局变量 | 存储在应用上下文中的全局变量 |
配置 | 可以配置会话存储方式和密钥 | 不涉及配置,存储在应用上下文中 | 不涉及配置,存储在应用上下文中 |
线程安全性 | 是 | 是 | 是 |
用于哪些情况 | 用户身份验证、购物车、用户偏好设置、用户活动记录等 | 在请求处理函数之外的地方访问请求相关的数据 | 在应用初始化之前或应用上下文之外访问应用配置和对象 |
存储和获取数据的方法 | 使用session 对象的方法,如session['key'] | 直接通过g 对象的属性,如g.key | 使用current_app 对象的属性和方法,如current_app.config['key'] |
生命周期 | 可以配置会话的过期时间和持久性 | 与请求处理期间的生命周期相同 | 与应用的生命周期相同 |
示例 | 实现用户登录和购物车功能 | 在请求处理函数之外的地方共享数据库连接 | 访问应用配置和对象的示例 |
当涉及到Flask中的current_app
时,理解它的概念和使用方法至关重要。让我们通过更多的Python示例来进一步说明这些概念。
current_app
章节1 current_app - 当前应用实例
current_app的基本概念
current_app
是Flask中的一个全局变量,代表当前运行的Flask应用实例。这个全局变量的存在使得在应用程序的各个部分都能够访问应用配置和其他应用特定的对象,而不需要显式传递应用实例。
current_app的作用
current_app
的主要作用是让您能够在应用程序的不同部分中访问应用实例,以便获取应用配置、数据库连接和其他应用范围的对象。它简化了在不同模块之间共享应用上下文的过程,使得代码更加模块化和可维护。
current_app的使用
要使用current_app
,首先需要导入flask
模块并从中引用它。以下是如何使用current_app
的示例:
from flask import Flask, current_appapp = Flask(__name__)# 在应用上下文中使用current_app
with app.app_context():# 配置DEBUG模式app.config['DEBUG'] = True# 访问应用配置debug_mode = current_app.config['DEBUG']print(f"DEBUG模式: {debug_mode}")
在这个示例中,我们首先创建了一个Flask应用实例,并在应用上下文中使用app.app_context()
创建应用上下文,以便可以安全地访问current_app
。接下来,我们调整了应用配置中的DEBUG
标志,并使用current_app
来访问配置值并输出到控制台。
这个示例展示了如何在应用上下文中使用current_app
来访问和修改应用配置。
章节2:current_app的上下文
什么是应用上下文?
在Flask中,应用上下文是一个特定的环境,用于在请求处理期间存储和传递应用程序范围的数据。它允许在不同函数之间共享状态和数据,而不需要使用全局变量。
current_app与应用上下文的关系
current_app
是应用上下文的一部分,它允许您在应用程序的任何地方访问应用实例。应用上下文的创建和销毁是由Flask自动管理的。
current_app何时可用,何时不可用?
current_app
只能在处于应用上下文中时才可用。它通常在请求处理期间可用,因此在视图函数中使用它是安全的。但是在应用初始化之前或应用上下文之外,使用current_app
可能会导致异常。
下面是一个示例,演示了如何在请求处理函数中使用current_app
来访问应用配置:
from flask import Flask, current_app, requestapp = Flask(__name__)@app.route('/')
def home():# 在视图函数中使用current_appdebug_mode = current_app.config['DEBUG']user_agent = request.headers.get('User-Agent')return f"DEBUG模式: {debug_mode}<br>User-Agent: {user_agent}"
在这个示例中,我们在home
视图函数中使用了current_app
来访问应用配置中的DEBUG
模式,并使用request
对象来获取用户代理(User-Agent)头部信息。
通过这些示例,我们更深入地了解了current_app
的概念和用法,并展示了如何在应用上下文中正确使用它。这有助于构建更健壮和可维护的Flask应用程序。
当涉及到Flask中的g
全局变量时,了解其概念和使用方法是构建更强大和可维护的应用程序的关键。本篇博客将深入讨论g
的基本概念、作用、应用上下文以及提供多个Python示例来说明其用途。
g
章节1:g - 全局上下文
g对象的基本概念
在Flask中,g
是一个特殊的全局变量,用于存储在请求处理期间共享的数据。它允许您在不同的请求处理函数之间共享状态和数据,而不需要使用全局变量或显式传递参数。
g对象的作用
g
的主要作用是在不同的请求处理函数之间传递数据,以便在同一请求处理期间的不同函数之间共享状态。这有助于保持代码的干净和可维护。
章节2:g对象的使用
在视图函数中使用g对象
要在视图函数中使用g
对象,首先需要导入flask
模块并从中引用它。以下是一个示例:
from flask import Flask, g, requestapp = Flask(__name__)@app.before_request
def before_request():# 在请求之前设置g对象的数据g.user = 'John'@app.route('/')
def home():# 在视图函数中访问g对象的数据user = g.userreturn f"欢迎, {user}!"
在这个示例中,我们使用before_request
装饰器来在请求之前设置g
对象的数据。然后,在home
视图函数中,我们可以轻松地访问g.user
,这使得在不同视图函数之间共享用户数据变得非常方便。
在请求处理函数之外的地方使用g对象
要在请求处理函数之外的地方使用g
对象,需要确保在应用上下文中,例如在一个自定义函数或中间件中。以下是一个示例:
from flask import Flask, gapp = Flask(__name__)def some_function():# 在函数中使用g对象,确保处于应用上下文中if 'user' in g:user = g.userreturn f"欢迎, {user}!"else:return "未找到用户数据"@app.before_request
def before_request():# 在请求之前设置g对象的数据g.user = 'Alice'@app.route('/')
def home():return some_function()
在这个示例中,我们创建了一个自定义函数some_function()
,并在函数中使用了g
对象。在before_request
装饰器中,我们设置了g.user
的数据,以便在some_function()
中访问。
章节3:应用上下文和线程安全性
应用上下文的生命周期
Flask管理应用上下文的创建和销毁,确保每个请求都有自己的上下文,避免数据混淆。每个请求处理完毕后,上下文会被销毁。
g对象的线程安全性
由于应用上下文的管理,g
对象是线程安全的。不同线程的g
对象互不干扰,每个线程都有自己的上下文和g
对象。
章节4:为什么使用g对象?
为什么不使用全局变量?
使用全局变量在多线程环境中可能会导致竞争条件和数据不一致性。g
对象提供了一种更安全和可维护的方式,在请求处理期间共享数据,而不会引入全局变量的问题。
常见用例
- 跨多个视图函数共享数据,如当前用户信息或数据库连接。
- 在请求处理函数之外的地方访问请求相关的数据,例如自定义函数或中间件。
章节5:示例:使用g对象共享数据库连接
from flask import Flask, g
import sqlite3app = Flask(__name__)
app.config['DATABASE'] = 'mydatabase.db'def get_db():db = getattr(g, '_database', None)if db is None:db = g._database = sqlite3.connect(app.config['DATABASE'])return db@app.route('/')
def home():db = get_db()# 使用数据库连接执行查询cursor = db.execute('SELECT * FROM users')users = cursor.fetchall()return str(users)@app.teardown_appcontext
def close_db(error):db = getattr(g, '_database', None)if db is not None:db.close()if __name__ == '__main__':app.run()
在这个示例中,我们使用g
对象来共享数据库连接。get_db()
函数负责获取数据库连接,确保每个请求都有自己的连接。close_db()
函数在应用上下文结束时关闭数据库连接,以确保资源的正确释放。
这篇博客详细介绍了Flask中的g
全局变量,包括其基本概念、作用、应用上下文、线程安全性、为什么使用它以及多个Python示例来说明其用途。了解如何正确使用g
将有助于构建更健壮和可维护的Flask应用程序。
当涉及到Flask中的会话(session)时,了解其概念和用法对于构建具有用户状态跟踪需求的Web应用程序非常重要。本篇博客将深入讨论Flask中的会话的基本概念、作用、配置以及提供多个示例来说明如何使用会话来跟踪用户状态。
session
章节1:会话(Session)的基本概念
会话的定义
会话是一种在Web应用程序中用于存储和跟踪用户特定数据的机制。它允许您在不同的HTTP请求之间存储和检索数据,以便实现用户认证、购物车、用户偏好设置等功能。
会话与Cookie的关系
通常,会话数据会存储在服务器上,并通过一个唯一的标识符(通常是一个cookie)与用户的浏览器关联起来。浏览器会在每个请求中发送该标识符,以便服务器识别用户并获取其相关数据。
章节2:会话的作用
会话的主要作用
会话的主要作用是跟踪用户的状态和存储与用户相关的信息。以下是一些常见的用例:
-
用户身份验证:会话可以用来存储已登录用户的信息,以便在整个会话期间保持其登录状态。
-
购物车:会话可以用来存储购物车中的商品,以便用户在浏览不同页面时保持其购物车状态。
-
用户首选项:会话可以用来存储用户的偏好设置,例如语言、主题等。
-
记录用户活动:会话可以用来跟踪用户的活动,例如最后一次访问时间、页面浏览次数等。
章节3:Flask中的会话
Flask中的会话对象
在Flask中,会话是通过session
对象来管理的。session
对象提供了一组方法来设置、获取和删除会话数据。
配置会话存储方式
在Flask中,您可以配置会话数据的存储方式。默认情况下,会话数据存储在客户端的cookie中,但也可以配置为存储在服务器上的数据库或其他存储介质中。
from flask import Flask, sessionapp = Flask(__name__)# 使用密钥对会话数据进行加密
app.config['SECRET_KEY'] = 'mysecretkey'
章节4:示例:使用会话实现用户登录
示例1:用户登录
以下示例演示了如何使用会话来实现用户登录功能。用户的用户名和密码将被存储在会话中,以便在整个会话期间保持其登录状态。
from flask import Flask, request, sessionapp = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecretkey'@app.route('/login', methods=['POST'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']# 假设进行身份验证if username == 'user' and password == 'password':session['logged_in'] = Truesession['username'] = usernamereturn '登录成功'else:return '登录失败'@app.route('/profile')
def profile():if 'logged_in' in session:return f'欢迎, {session["username"]}!'else:return '未登录'if __name__ == '__main__':app.run()
在这个示例中,用户的登录状态和用户名存储在会话中。/login
路由用于接收用户的登录表单,并将登录状态存储在会话中。/profile
路由检查用户是否已登录,如果已登录,则显示欢迎消息。
章节5:示例:使用会话实现购物车功能
示例2:购物车功能
以下示例演示了如何使用会话来实现购物车功能。用户可以将商品添加到购物车中,购物车的内容将存储在会话中。
from flask import Flask, request, session, render_templateapp = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecretkey'@app.route('/')
def index():return render_template('index.html', cart=session.get('cart', {}))@app.route('/add_to_cart/<product>')
def add_to_cart(product):cart = session.get('cart', {})cart[product] = cart.get(product, 0) + 1session['cart'] = cartreturn '商品已添加到购物车'if __name__ == '__main__':app.run()
在这个示例中,购物车的内容存储在会话中的cart
键下。用户可以通过访问/add_to_cart/<product>
路由来添加商品到购物车中。
这篇博客详细介绍了Flask中的会话的概念、作用、配置以及通过示例演示了如何使用会话来实现用户登录和购物车功能。会话是构建用户状态跟踪功能的关键,对于许多Web应用程序都至关重要。通过了解如何使用会话,您可以更好地满足用户的需求和提供个性化的体验。
相关文章:
Python Flask 基础入门第六课: Flask 全局变量 current_app, g 以及 session各自如何使用 有什么差异
全局变量 current_app, g 以及 session 全局变量差异汇总表current_app章节1 current_app - 当前应用实例current_app的基本概念current_app的作用current_app的使用 章节2:current_app的上下文什么是应用上下文?current_app与应用上下文的关系current_a…...
第33节: Vue3 方法与在线检测
UniApp 使用 Vue3 框架时,您可以使用方法和在线检测来处理应用程序中的逻辑和数据。下面是一个示例,演示了如何在 UniApp 中使用 Vue3 框架使用方法和在线检测: <template> <view> <button click"handleClick"&g…...
React学习计划-React16--React基础(二)组件与组件的3大核心属性state、props、ref和事件处理
1. 组件 函数式组件(适用于【简单组件】的定义) 示例: 执行了ReactDOM.render(<MyComponent/>, ...)之后执行了什么? React解析组件标签,找到了MyComponent组件发现组件是使用函数定义的,随后调用该…...
flink yarn-session 启动失败retrying connect to server 0.0.0.0/0.0.0.0:8032
原因分析,启动yarn-session.sh,会向resourcemanager的端口8032发起请求: 但是一直无法请求到8032端口,触发重试机制会不断尝试 备注:此问题出现时,我的环境ambari部署的HA 高可用hadoop,三个节点…...
.NET面试题(二)
1.c# 中new关键字的作用 实例化对象和调用构造函数:当使用 new 关键字创建一个类的实例时,它会为对象分配内存,并调用相应的构造函数来初始化该对象。 隐藏基类成员(方法、属性、事件等):当在派生类中…...
ffplay工具
在编译ffmpeg时,如果系统中包含了SDL库,则会默认编译生成ffplay工具,否则无法生成ffplay工具。 ffplay即可以作为播放器,也可以作为很多图像化音视频数据的分析工具,通过它可以看到视频图像的运动估计方向、音频数据的…...
第36节: Vue3 事件修饰符
在UniApp中使用Vue3框架时,你可以使用事件修饰符来更方便地处理用户交互事件。以下是一个示例,演示了如何在UniApp中使用Vue3框架使用事件修饰符: <template> <view> <button click.prevent"handleClick">Cli…...
如何在本地安装Flask并将其web界面发布到公网上远程访问协同开发
目录 前言 1. 安装部署Flask 2. 安装Cpolar内网穿透 3. 配置Flask的web界面公网访问地址 4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask,以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架,…...
八:爬虫-MySQL基础
一:MySQL数据库基础 1.MySQL数据库介绍 MySQL是一个[关系型数据库管理系统],由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Rela…...
Android定制ROM简介
Android定制ROM简介 这篇文章是为对自定义ROM、AOSP等词汇不太熟悉的技术爱好者和好奇的人写的。我希望通过向您介绍这个世界来开始博客写作。 在我们将注意力转向定制ROM之前,让我们先了解一些基础知识。 什么是操作系统? 维基百科对此的定义简洁而…...
百模大战中的AI行业:新趋势与未来发展
文章目录 每日一句正能量前言技术进步应用拓展行业变革人才竞争后记 每日一句正能量 人生最重要的价值是心灵的幸福,而不是任何身外之物。 前言 随着科技的迅猛发展,人工智能(AI)已经成为引领技术革命的重要驱动力之一。在当前的…...
VScode安装C/C++编译器步骤
一、安装C/C插件 二、安装 MinGW-w64 工具链 使用国内源 git clone https://gitee.com/cuihongxi/ubuntu2-mac.git 下载后进入到VScode文件夹下,点击msys2-x86_64-20231026.exe进行安装 完成后,确保选中“立即运行 MSYS2”框,然后选择“完…...
【Date对象】js中的日期类型Date对象的使用详情
😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:JavaScript小贴士 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续…...
【PyTorch】代码学习
文章目录 直接定义nn.Sequential(), 然后append(),最后直接net(),少写很多forward,适合直连式网络 直接定义nn.Sequential(), 然后append(),最后直接net(),少写很多forward,适合直连式网络 代码来源:https://github.com/zshhans/MSD-Mixer/b…...
ElasticSeach--springboot中使用
目录 一.引入依赖 二.配置链接信息 三.索引库测试 1.创建索引库 2.查询索引库 3.删除索引库 四.文档测试 1.添加文档 2.修改文档 3.删除文档 4.查询具体文档 5.批量添加文档 五.查询测试 1.查询所有 2.根据属性term匹配查询 3.分页查询 4.排序 5.过滤属性 6.boo…...
(1)(1.9) MSP (version 4.2)
文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议,可通过任何串行端口进行遥测、OSD 和传感器。这样,ArduPilot 就能将遥测数据发送到 MSP 兼容设备(如大疆护目镜),用于屏幕显示&#x…...
mysql 表锁 行锁
目录 表锁(Table Lock) 行锁(Row Lock) 进一步通过举例解释 update操作走的是什么锁 表锁示例: 行锁示例: MySQL 中常见的锁类型包括: 表锁(Table Lock) 是针对整个…...
Google 提示:切忌滥用 DORA 指标
谷歌的 DevOps 研究与评估团队从事指标交易,即 DevOps 指标。但其最新的相关报告也警告不要过度使用这些指标。 DevOps 研究与评估小组(DORA)建议 IT 专业人员根据四个关键指标来评估团队绩效:部署频率,变更准备时间&a…...
2023年全球架构师峰会(ArchSummit北京站2023)-核心PPT资料下载
一、峰会简介 ArchSummit聚焦业界强大的技术成果,秉承“实践第一、案例为主”的原则,展示先进技术在行业中的典型实践,以及技术在企业转型、发展中的推动作用。旨在帮助技术管理者、CTO、架构师做好技术选型、技术团队组建与管理,…...
安全、高效的MySQL DDL解决方案
MySQL作为目前应用最广泛的开源关系型数据库,是许多网站、应用和商业产品的主要数据存储。在生产环境,线上数据库常常面临着持续的、不断变化的表结构修改(DDL),如增加、更改、删除字段和索引等等。其中一些DDL操作在M…...
100GPTS计划-AI学术AcademicRefiner
地址 https://chat.openai.com/g/g-LcMl7q6rk-academic-refiner https://poe.com/AcademicRefiner 测试 减少相似性 增加独特性 修改http://t.csdnimg.cn/jyHwo这篇文章微调 专注于人工智能、科技、金融和医学领域的学术论文改写,秉承严格的专业和学术标准。 …...
k8s 中部署Jenkins
创建namespace apiVersion: v1 kind: Namespace metadata:name: jenkins创建pv以及pvc kind: PersistentVolume apiVersion: v1 metadata:name: jenkins-pv-volumenamespace: jenkinslabels:type: localapp: jenkins spec:#storageClassName: manualcapacity:storage: 5Giacc…...
Spring Cloud和Zookeeper的集成,构建高可扩展的分布式系统
引言 构建高可扩展的分布式系统是现代应用程序开发中的重要挑战之一。在分布式系统中,负载均衡和分布式锁是两个关键问题。本文将介绍如何使用Spring Cloud和Zookeeper集成来实现高可扩展的分布式系统,并分析其负载均衡原理和分布式锁的应用。 1. 分布…...
【唐山海德教育】安全员c证怎么考
1、注册地在本市的施工单位在职“三类人员”可申请参加安全生产考核; 2、职业道德良好,身体健康,年龄不超过60周岁(法定代表人除外); 3、筑施工企业专职安全生产管理人员需有中专(含高中、中技…...
MySQL是如何保证数据不丢失的?
文章目录 前言Buffer Pool 和 DML 的关系DML操作流程加载数据页更新记录 数据持久化方案合适的时机刷盘双写机制日志先行机制日志刷盘机制Redo Log 恢复数据 总结 前言 上篇文章《InnoDB在SQL查询中的关键功能和优化策略》对InnoDB的查询操作和优化事项进行了说明。但是&#…...
CUMT--Java复习--泛型与集合
目录 一、泛型 1、概述 2、通配符 3、有界类型 二、集合 1、概述 2、迭代器接口 三、集合类 1、Collection接口 2、List接口 3、Set接口 4、Queue接口 5、Map接口 四、集合转换 五、集合工具类 一、泛型 1、概述 从JDK5.0开始,Java引入泛型类型&…...
Android 权限申请
在Android中,从Android 6.0(API级别23)开始,应用在运行时需要动态申请权限。以下是一些步骤来动态申请权限: 在应用的清单文件(AndroidManifest.xml)中声明需要的权限。例如,如果应…...
R语言【base】——invisible将控制台的输出模式调整为隐藏,只允许赋值后输出,返回对象的(临时)不可见副本
Package base version 4.3.2 invisible(x NULL) 参数【x】:一个任意的 R 对象,默认为 NULL。 如果希望函数返回的值可以赋值,但在未赋值时不打印,则可以使用该函数。 f <- function(x){if (x){return (x)} else {return (in…...
LA@线性代数学习总结@主要对象和问题@思想方法
文章目录 线性代数研究对象主要问题联系核心概念核心定理 核心操作和运算基础高级小结 性质和推导方法问题转换为线性方程组求解问题验证和推导性质定理 线性代数研究对象 线性代数的研究对象主要是行列式和矩阵(向量)矩阵这种对象可以做的操作和运算很多,特别是方阵,它们的计…...
VMware克隆虚拟机
要求:利用模板虚拟机hadoop100,克隆出hadoop101虚拟机。 1、鼠标右键点击已存在的模板虚拟机hadoop100 --> 管理 --> 克隆 2、选择克隆自虚拟机中的当前状态 3、创建完整克隆 4、修改虚拟机名称、位置 5、等待克隆完成后,则成功克隆出…...
太原做网站找谁/中国免费网站服务器2020
2016年计算机二级Access考前冲刺试题与答案参考答案与解析(1)D【解析】组合框或列表框可以从一个表或查询中取得数据,或从一个值列表中取得数据,在输入时,我们从列出的选项值中选择需要的项,从而保证同一个数据信息在数据库中存储…...
wordpress 微信抓取/sem推广软件选哪家
简介: Charles主要的功能包括: 支持SSL代理。可以截取分析SSL的请求。支持流量控制。可以模拟慢速网络以及等待时间(latency)较长的请求。支持AJAX调试。可以自动将json或xml数据格式化,方便查看。支持AMF调试。可以将…...
网络游戏那个网站做的最好/免费站长工具
快捷方式 应该来说 很多人都做过,我们就来看一下基本的快捷方式 是怎么实现的,会有什么问题? 首先 肯定要获取权限: 1 <!-- 添加快捷方式 --> 2 <uses-permission android:name"com.android.launcher.permissi…...
无锡 网站开发/广州关键词seo
本设计模式系列文章会持续更新,链接是之前博主在博客园中所写。 设计模式一之策略模式 设计模式二之观察者模式 设计模式三之单例模式 设计模式四之适配器模式和外观模式...
登录网站后没有转页面/成长电影在线观看免费
--接文:《仓库拉链算法的数据恢复机制(重跑中间任意一天保证数据的准确完整性) 》;参考博文地址:http://blog.csdn.net/nsj820/article/details/6096682 本文是在《仓库拉链算法的数据恢复机制(重跑中间任意一天保证数据的准确完整性) 》基础…...
亳州建设网站/推广公司产品
vb.net WPF webbrowser window.close 关闭后不触发 WindowClosing 事件 WNDPROC解决方式 #Region "WPF 当浏览器窗体关闭时触发 Quit事件 "#If OnSourceInitialized ThenProtected Overrides Sub OnSourceInitialized(e As EventArgs) onloa…...