Flask框架 之 上下文管理前戏
偏函数
自动传递参数
import functools def index(a1,a2):
return a1 + a2 # 原来的调用方式
# ret = index(1,23)
# print(ret) # 偏函数,帮助开发者自动传递参数
new_func = functools.partial(index,666)
ret = new_func(1)
print(ret)
super和执行类的区别?
python3里所有的类默认继承Object。
super:根据mro的顺序执行方法
类.方法:主动执行类的方法
示例一:
class Base(object): def func(self):
print('Base.func') class Foo(Base): def func(self):
# 方式一:根据mro的顺序执行方法
# super(Foo,self).func()
# 方式二:主动执行Base类的方法
# Base.func(self) print('Foo.func') obj = Foo()
obj.func()
实例二:
class Base(object): def func(self):
super(Base, self).func() #Bar.func
print('Base.func') class Bar(object):
def func(self):
print('Bar.func') class Foo(Base,Bar): 先继承base,然后bar
pass # 示例一
# obj = Foo()
# obj.func() #先找Base,再找Bar
# print(Foo.__mro__) # 示例二
# obj = Base() #找自己,没有再找父类,object没有func(),报错
# obj.func()
面向对象中特殊方法 setattr/getattr注意事项:
class Foo(object):
def __init__(self):
# self.storage = {} #实例化对象就会执行__init__方法,self是对象,对象.storage={} ,执行setattr方法
object.__setattr__(self,'storage',{}) #直接调用父类的setattr方法,防止还没设置就调用报错 def __setattr__(self, key, value):
print(key,value,self.storage) obj = Foo()
obj.xx = 123
基于列表实现栈
后进先出,相当于弹夹。
有两个方法:push()和pop().
class Stack(object): def __init__(self):
self.data = [] #可以使redis,可以使字典,也可以是其他 def push(self,val): #添加是传一个参数
self.data.append(val) def pop(self): #删除不要参数
return self.data.pop() def top(self):
return self.data[-1] #每次取最后一次,只是读,不删 _stack = Stack() _stack.push('佳俊')
_stack.push('咸鱼') print(_stack.pop())
print(_stack.pop())
slots
class Foo(object):
__slots__ = ('name',) #允许访问的字段 (对象.字段)
def __init__(self):
self.name = 'alex'
# self.age = 18 obj = Foo()
print(obj.name)
# print(obj.age)
import functools
try:
from greenlet import getcurrent as get_ident
except:
from threading import get_ident class Local(object):
__slots__ = ('__storage__', '__ident_func__') def __init__(self):
# __storage__ = {1231:{'stack':[]}}
object.__setattr__(self, '__storage__', {})
object.__setattr__(self, '__ident_func__', get_ident) def __getattr__(self, name):
try:
return self.__storage__[self.__ident_func__()][name]
except KeyError:
raise AttributeError(name) def __setattr__(self, name, value):
# name=stack
# value=[]
ident = self.__ident_func__()
storage = self.__storage__
try:
storage[ident][name] = value
except KeyError:
storage[ident] = {name: value} def __delattr__(self, name):
try:
del self.__storage__[self.__ident_func__()][name]
except KeyError:
raise AttributeError(name)
源码
以上知识综合应用:
import functools
try:
from greenlet import getcurrent as get_ident
except:
from threading import get_ident class Local(object):
__slots__ = ('__storage__', '__ident_func__') def __init__(self):
# __storage__ = {1231:{'stack':[]}}
object.__setattr__(self, '__storage__', {})
object.__setattr__(self, '__ident_func__', get_ident) def __getattr__(self, name):
try:
return self.__storage__[self.__ident_func__()][name]
except KeyError:
raise AttributeError(name) def __setattr__(self, name, value):
# name=stack
# value=[]
ident = self.__ident_func__()
storage = self.__storage__
try:
storage[ident][name] = value
except KeyError:
storage[ident] = {name: value} def __delattr__(self, name):
try:
del self.__storage__[self.__ident_func__()][name]
except KeyError:
raise AttributeError(name) """
__storage__ = {
12312: {stack:[ctx(session/request) ,]}
} """ # obj = Local()
# obj.stack = []
# obj.stack.append('佳俊')
# obj.stack.append('咸鱼')
# print(obj.stack)
# print(obj.stack.pop())
# print(obj.stack) class LocalStack(object):
def __init__(self):
self._local = Local() def push(self,value):
rv = getattr(self._local, 'stack', None) # self._local.stack =>local.getattr
if rv is None:
self._local.stack = rv = [] # self._local.stack =>local.setattr
rv.append(value) # self._local.stack.append(666)
return rv def pop(self):
"""Removes the topmost item from the stack, will return the
old value or `None` if the stack was already empty.
"""
stack = getattr(self._local, 'stack', None)
if stack is None:
return None
elif len(stack) == 1:
return stack[-1]
else:
return stack.pop() def top(self):
try:
return self._local.stack[-1]
except (AttributeError, IndexError):
return None class RequestContext(object):
def __init__(self):
self.request = "xx"
self.session = 'oo' _request_ctx_stack = LocalStack() _request_ctx_stack.push(RequestContext()) def _lookup_req_object(arg): ctx = _request_ctx_stack.top() return getattr(ctx,arg) # ctx.request / ctx.session request = functools.partial(_lookup_req_object,'request')
session = functools.partial(_lookup_req_object,'session') print(request())
print(session())
local:帮助我们为每个协程或线程开辟空间的,
localstark:帮助我们在local维护一个列表,维护成一个栈,对列表中的数据进行添加或移除。通过栈对它进行操作。
全局变量只有在初次加载时执行。
Flask框架 之 上下文管理前戏的更多相关文章
- Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块
Flask中上下文,分为请求上下文和应用上下文.既状态留存 ,就是把变量存在某一个地方可以调用 请求上下文:实际就是request和session用法理念,既都是可以存储东西. 应用上下文:既变量共享 ...
- Flask框架 之 学生管理分析
先看模板吧. index.html <body> <h1>学生列表</h1> <table border="1"> <thea ...
- Python-S9-Day116——Flask框架相关
01 内容回顾 02 Flask框架:路由和视图(一) 03 Flask框架:路由和视图(二) 04 Flask框架:路由和视图(三) 05 Flask框架:路由和视图(四) 06 Flask框架:s ...
- python框架之Flask(4)-上下文管理
知识储备 偏函数 作用 偏函数,帮助开发者自动传递参数. 使用 import functools def index(a1, a2): return a1 + a2 # 原来的调用方式 # ret = ...
- flask你一定要知道的上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- Flask的上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- Flask上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- Flask上下文管理及源码刨析
基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...
- flask 上下文管理 &源码剖析
基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...
随机推荐
- C#进阶之路(七)反射的应用
反射在C#中的应用还是很多的,但它对代码的性能有一定影响. 反射的性能: 使用反射来调用类型或者触发方法,或者访问一个字段或者属性时clr 需要做更多的工作:校验参数,检查权限等等,所以速度是非常慢的 ...
- ubuntu下访问支付宝官网,安装安全控件
(1)根据支付宝提示下载安装控件的压缩包 aliedit.tar.gz (2)解压安装 (3)重启浏览器就可以了
- raw_in_fields
在admin后台类中加入raw_id_fields(只适用于外键)后,会显示外键的详细信息
- fn project 生产环境使用
此为官方的参考说明 Running Fn in Production The QuickStart guide is intended to quickly get started and kic ...
- dubbo-demo安装运行指南
步骤步骤:1.安装JDK:2.安装Tomcat:3.安装Zookeeper:4.安装Dubbo: 修改Consumer配置文件
- J-Link在SWD模式与MCU能连接成功但不能读写
今天在J-Link的排线末端引出3.3v.SWDIO.SWCLK.GND,连接到stm32上,发现只能连接成功,不能读和写,出现下面错误: - ERROR: RAM check failed @ ad ...
- 6kzz整合ueditor
用过6kzz免费版的朋友都知道,它的后台编辑器是kindeditor,并且是两三年前的版本,有很多功能都没有,现在的kindeditor也不错,但感觉还是没有百度的ueditor强大(据说微信后台的编 ...
- 1084 Broken Keyboard
题意:给出两个字符串(有字母,数字和下划线_组成),第一个字符串str1是由键盘输入的字符串,第二个字符串str2是屏幕显示的字符串,问键盘有哪几个按键坏了,根据输入的顺序,输出坏掉的键(仅输出一次) ...
- PHP - Swoole websocket理解
php swoole实现websocket功能 1.确保安装了swoole扩展. 2.撰写服务程序 <?php //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = ...
- tomcat启动时的java_home和jre_home错误
The JRE_HOME environment variable is not defined correctlyThis environment variable is needed to run ...