Flask 学习笔记.1

本文对比了Django、Flask和Tornado等主流Python Web框架的特点,并介绍了WSGI协议的作用。此外,还详细讲解了如何通过自定义Local对象实现线程间的数据隔离,确保每个线程拥有独立的数据空间。

1. 主流Python Web框架

  1. django:大而全面,内部提供:ORM、Admin、中间件、Form、ModelForm、Session、缓存、信号、CSRF;
  2. flask:短小精悍,可扩展性强,第三方组件丰富;
  3. tornado:短小精悍,可扩展性强,但是第三方没这么丰富,强项——异步非阻塞。

wsgi: 全称Python Web Server Gateway Interface,
作用: 1. WSGI是一套接口标准协议/规范;
2. 通信(作用)区间是Web服务器和Python Web应用程序之间;
3. 目的是制定标准,以保证不同Web服务器可以和不同的Python程序之间相互通信

2. 自定义local对象

操作如下代码时候

from threading import Thread,local
ss=local()

def task(arg):
	#对象.val= 1/2/3/4/5
	ss.value = arg

for i in range(10):
	t=Thread(target=task,args(i,))
	t.start
  1. 使用多线程时,创建 threading.local() 对象,可以为线程每个线程开辟一块空间并进行数据存储,使用
  2. 自己通过字典创建一个类似threading.local的东西
dict_s={
		4215:{val:0}
		4217:{val:1}
		4218:{val:2}
		4219:{val:3}
		线程id:{val:*}

		}

def set(k,v):
	ident = get_ident()
	if ident in dict_s:
		dict_s[ident][k]=v
	else:
		dict_s[ident]={k:v}
def get(k):
	ident=get_ident()
	return dict_s[ident][k]
def task(arg):
	#对象.val= 1/2/3/4/5
	set('val',arg)
	v=get('val')
	print(v)
	
for i in range(10):
	t=Thread(target=task,args(i,))
	t.start
  1. 自定义Local对象(基于面向对象)PS:flask使用的就是如此方式
    ***作用:***为每个线程(协程)开辟一块空间存储数据
try:
	#获取协程id,如果没有协程,使用线程
	from greenlet import getcurrent as get_ident
except Exception as e:
	from threding import get_ident
from threading import get_ident
class dictLocal(object):
    def __init__(self):
        # self.dict_s = {}
        object.__setattr__(self,'dict_s',{})
    def __setattr__(self, key, value):
        ident = get_ident()
        if ident in self.dict_s:
            self.dict_s[ident][key] = value
        else:
            self.dict_s[ident] = {key: value}

    def __getattr__(self, item):
        ident = get_ident()
        return self.dict_s[ident][item]

def task(arg):
    obj=dictLocal()
    # 对象.val= 1/2/3/4/5

    obj.val= arg
    v = obj.val
    print(v)


for i in range(10):
    t = Thread(target=task,args=(i, ))
    t.start()
### STM32 Flash 学习资料与技术笔记 STM32 Flash 的学习可以从其基本原理、编程操作以及实际应用展开。以下内容结合了相关引用和技术细节,帮助用户深入理解 STM32 Flash 的使用方法。 #### 1. STM32 Flash 基本原理 STM32 的 Flash 存储器分为主存储块和信息块两部分[^3]。主存储块用于存放用户程序代码,而信息块则用于存放一些特定配置信息,如选项字节等。Flash 的主要特性包括: - **启动模式**:STM32 支持三种启动模式,通过 BOOT[1:0] 引脚配置实现。最常用的是从用户闪存空间启动(Flash 空间 512K),即复位后直接从 Flash 运行程序[^1]。 - **耐用性**:用户 Flash 可以反复擦除约 10 万次,因此无需担心芯片锁死或被擦爆。 #### 2. Flash 编程操作 Flash 编程涉及写入、擦除和读取操作。以下是具体步骤和技术要点: - **写入选项字节**:在进行选项字节写入时,需要先检测忙状态 (BSY),然后解除小锁并设置控制寄存器 CR 的 OPTPG 位为 1,表示即将写入选项字节。之后通过指针写入指定地址的半字数据,并等待忙状态结束[^2]。 - **代码示例**:以下是一个简单的 Flash 写入代码示例: ```c #include "stm32f1xx_hal.h" void Flash_Write(uint32_t Address, uint16_t Data) { HAL_StatusTypeDef status; // 解锁 Flash HAL_FLASH_Unlock(); // 擦除页 FLASH_EraseInitTypeDef EraseInitStruct; EraseInitStruct.TypeErase = TYPEERASE_PAGES; EraseInitStruct.PageAddress = Address; EraseInitStruct.NbPages = 1; uint32_t PAGEError = 0; status = HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError); if (status == HAL_OK) { // 写入数据 status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, Data); } // 锁定 Flash HAL_FLASH_Lock(); } ``` #### 3. 电子签名与唯一 ID STM32 的电子签名存储在系统存储器中,包含芯片识别信息,出厂时编写且不可更改。具体信息如下: - **闪存容量寄存器**:基地址为 `0x1FFFF7E0`,大小为 16 位,值表示 Flash 容量(单位 KB)。 - **产品唯一身份标识寄存器**:基地址为 `0x1FFFF7E8`,大小为 96 位,每个芯片的这 96 位数据均不同。可以利用该唯一 ID 实现加密功能,确保程序只能在指定设备上运行。 #### 4. 学习资源推荐 - **官方文档**:STMicroelectronics 提供的 STM32 数据手册和参考手册是学习 Flash 操作的最佳资源。 - **在线教程**:江科大 STM32 学习笔记(下) 和 STM32 学习基础知识笔记 是不错的入门材料。 - **实践项目**:通过实际编写 Flash 操作代码,加深对 Flash 编程的理解。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值