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-day2——cbv源码分析模版语法请求与响应session及源码分析闪现请求扩展
Flask 上下文管理-- (session,request,current_app的传递)