1、偏函数
# 先给函数传一个值进去——flask的源码中很多这种用法
from functools import partial
def test(x,y,z):
return x+y+z
# 原来的调用方式
# print(test(1,2,3))
# 使用偏函数
test=partial(test,1) # test()执行时,会把值传给第一个参数
print(test(2,3)) # 这里只能传后两个参数,多了会报错
2、主动执行父类方法
class Base(object):
def func(self):
print('Base.func')
class Foo(Base):
def func(self):
# 方式一:根据mro即类的继承顺序执行方法
super(Foo, self).func() # 按Foo.__mro__继承关系
# 方式二:主动执行父类方法
# Base.func(self)
print('Foo.func')
3、面向对象的易错点
# 以下代码会抛异常
class Foo(object):
def __init__(self):
self.storage = {} # 创建的时候要调用__setattr__()
def __setattr__(self, key, value):
print(self.storage) # 没有创建成,又在这里使用,报错
print(key, value)
obj = Foo() # 实例化调用__init__()
obj.a = 123
4、栈(先进后出)
class Stack(object):
def __init__(self):
self.data = []
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('shj')
_stack.push('lwb')
5、__slots__()
class Foo(object):
__slots__ = ('name') # 外部只能拿到这里面写的
def __init__(self):
self.name='shj'
# self.age=18 # __slots__如果只写了name,那么这里也要注释
obj = Foo()
print(obj.name)
# print(obj.age) # 会抛异常
6、Flask上下文管理:request,session
# 简单来说,falsk上下文管理可以分为三个阶段:
1、请求进来时,将请求相关的数据放入上下问管理中
2、在视图函数中,要去上下文管理中取值
3、请求响应,要将上下文管理中的数据清除
# 详细点来说:
1、请求刚进来,将request,session封装在RequestContext类中,app,g封装
在AppContext类中,并通过LocalStack将requestcontext和appcontext放入Local类中
2、视图函数中,通过localproxy--->偏函数--->localstack--->local取值
3、请求响应时,先执行save.session()再各自执行pop(),将local中的数据清除
# Flask中的session是什么时候创建,什么时候销毁的?
当请求进来时,会将request和session封装为一个RequestContext对象,通过LocalStack将
RequestContext放入到Local对象中,因为请求第一次来session是空值,
所以执行open_session,给session(uuid4())赋值,再通过视图函数处理,请求响应时
执行save.session,将签名session写入cookie中,再讲Local中的数值pop掉。
7、第三方组件:flask_session
该组件帮助我们把session加入到默认的cookie中
安装:pip3 install flask-session
from redis import Redis
from flask import Flask,session
from flask_session import Session
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis' #指定session存放位置是redis
app.config['SESSION_REDIS'] = Redis(host='127.0.0.1',port=6379)
Session(app)
@app.route('/login')
def login():
session['user'] = 'shj'
return '登录成功'
@app.route('/index')
def index():
print(session.get('user'))
return '主页'
if __name__ == '__main__':
app.run()