1.4 flask request和session

Posted zhen1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.4 flask request和session相关的知识,希望对你有一定的参考价值。

2019-1-4 18:13:57

越努力,越幸运!

还有121天,flask讲完,还有4天,总时长130天 还有13天就讲完了 一月争取看完!!!

永远不要高估自己!

今天学了request和session的上下文管理

其实就是如图所示 流程图

技术分享图片

 

flask只是把请求相关东西放在某个神奇的地方,当你需要的时候就去那边拿去

然后用上下文管理去拿

 

贴上源码

面向对象中特殊的方法

class Foo(object):
    def __init__(self):
        # self.storage = {}
        object.__setattr__(self,storage,{})

    def __setattr__(self, key, value):
        print(key,value,self.storage)

obj = Foo()
obj.xx = 123  # __setattr__()

LocalStack.py

# by luffycity.com
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())

request上下文管理

# by luffycity.com
import redis
from flask import Flask,request,session
from flask.sessions import SecureCookieSessionInterface
from flask_session import Session

app = Flask(__name__)

# app.session_interface = SecureCookieSessionInterface()
# app.session_interface = RedisSessionInterface()
app.config[SESSION_TYPE] = redis
app.config[SESSION_REDIS] = redis.Redis(host=140.143.227.206,port=6379,password=1234)
Session(app)

@app.route(/login)
def login():
    session[user] = alex
    return asdfasfd

@app.route(/home)
def index():
    print(session.get(user))

    return ...


if __name__ == __main__:
    app.run()
    # app.__call__
    # app.wsgi_app

笔记:

s9day117 

内容回顾:
    1. django和flask区别?
        
    2. flask
        - 配置文件
            - 使用
            - 原理
        - 路由系统
            - 书写方式
            - 参数
        - 视图 
            - CBV
        - 蓝图 
            - 目录结构划分
            - 前缀
            - 应用特殊装饰器
        - 特殊装饰器
    3. session实现原理
        
    4. threading.local 
        
今日内容概要:
    1. 上下文管理:request
    2. 上下文管理:session  
       其他:
            - app
            - g 
    3. 第三方组件:flask-session
    4. pymysql操作数据库
       数据库连接池 *** 
       
内容详细:
    前夕:
        - 偏函数
            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和执行类的区别?
            """
            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()
                    print(Base.func)

            class Bar(object):
                def func(self):
                    print(Bar.func)

            class Foo(Base,Bar):
                pass

            # 示例一
            # obj = Foo()
            # obj.func()
            # print(Foo.__mro__)

            # 示例二
            # obj = Base()
            # obj.func()
        
        - 面向对象中特殊方法 setattr/getattr注意事项:
            class Foo(object):
                def __init__(self):
                    # self.storage = {}
                    object.__setattr__(self,storage,{})

                def __setattr__(self, key, value):
                    print(key,value,self.storage)
                    


            obj = Foo()
            obj.xx = 123
        
        
        - 基于列表实现栈 
            
            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(佳俊)
            _stack.push(咸鱼)

            print(_stack.pop())
            print(_stack.pop())
        
        
        - 全局变量只有在初次加载时执行
        
    1. 上下文管理:request
        
        a. 温大爷:wsig
        b.   赵毅:
                    ctx = ReuqestContext(session,request)
                    ctx.push()
        c.   刘松:LocalStack,把ctx对象添加到local中
        d.   空调:Local
                    __storage__={
                        1321:{stack:[ctx,]}
                    }
        
    2. 上下文管理:session 
        
        a. 温大爷:wsig
        b.   赵毅:
                    ctx = ReuqestContext(session=None,request)
                    ctx.push()
        c.   刘松:LocalStack,把ctx对象添加到local中
        d.   空调:Local
                    __storage__={
                        1321:{stack:[ctx,]}
                    }
        e.   郭浩:通过刘松获取ctx中的session,给session赋值(从cookie中读取数据) => open_session 
        
    
    3. flask-session 
    
        pip3 install flask-session 
        
        掌握:
            - 使用
                # by luffycity.com
                import redis
                from flask import Flask,request,session
                from flask.sessions import SecureCookieSessionInterface
                from flask_session import Session

                app = Flask(__name__)

                # app.session_interface = SecureCookieSessionInterface()
                # app.session_interface = RedisSessionInterface()
                app.config[SESSION_TYPE] = redis
                app.config[SESSION_REDIS] = redis.Redis(host=140.143.227.206,port=6379,password=1234)
                Session(app)

                @app.route(/login)
                def login():
                    session[user] = alex
                    return asdfasfd

                @app.route(/home)
                def index():
                    print(session.get(user))

                    return ...


                if __name__ == __main__:
                    app.run()
            - 原理:
                - session数据保存到redis
                    session:随机字符串1:q23asifaksdfkajsdfasdf
                    session:随机字符串2:q23asifaksdfkajsdfasdf
                    session:随机字符串3:q23asifaksdfkajsdfasdf
                    session:随机字符串4:q23asifaksdfkajsdfasdf
                    session:随机字符串5:q23asifaksdfkajsdfasdf
                - 随机字符串返回给用户。
                    随机字符串
                
                
                源码:
                    from flask_session import RedisSessionInterface
                
                
    4. pymysql 
    
作业:代码统计系统
    表结构设计:
        用户表:
            ID    用户名     密码    昵称
        代码记录:
            ID    用户ID   行数   日期 
                                
    功能:
        1. 用户登录 
        2. 用户列表 
            ID    用户名        选项
            1      华强     查看代码行数记录
            2      华强     查看代码行数记录
            3      华强     查看代码行数记录
            4      华强     查看代码行数记录
            5      华强     查看代码行数记录
            6      华强     查看代码行数记录
        3. 用户代码记录 
        
        4. 上传自己代码[xx.py]
        
    要求:
        1. session存储在redis
        2. 上传时支持压缩文件或文件夹
            - python如何实现文件夹解压
            - 查看某个目录下的所有文件和文件夹
            

 

以上是关于1.4 flask request和session的主要内容,如果未能解决你的问题,请参考以下文章

Flask--session

flask-day2——cbv源码分析模版语法请求与响应session及源码分析闪现请求扩展

Flask 上下文管理-- (session,request,current_app的传递)

Flask初识,第十篇,Flask中的装饰器 before_request after_request

Flask之视图

Flask框架 —— session源码分析