flask之上下文管理-flask_session-栈-偏函数-调用父类方法-面向对象易错点

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值