1. 程式人生 > >1.4 flask request和session

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如何實現資料夾解壓
            - 檢視某個目錄下的所有檔案和資料夾