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='')
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='')
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的request和session是从哪里来的?
因为之前一直在项目中使用django, 所以在学习Flask的过程中, 难免对吧django和Flask进行对比, 这一次我发现Flask中的request和session并没有想象的那么简单, 所以 ...
- 9.Flask Cookie和Session
1.1.概念 cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了解决这个问题,第 ...
- flask基础之session原理详解(十)
前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...
- [flask]flask_login模块,session及其他
读flask源码的时候,有一点一直到现在都没有一个清晰的概念,比如四个全局变量g,current_app,session,request是怎么做到的 按照查到的资料里面的说法,为了不至于每次都主动调用 ...
- Flask蓝图,Session,闪现,中间件等
Session 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设 ...
- flask总结之session,websocket,上下文管理
1.关于session flask是带有session的,它加密后存储在用户浏览器的cookie中,可以通过app.seesion_interface源码查看 from flask import Fl ...
- Flask中的session ,自定义实现 session机制, 和 flask-session组件
session 是基于cookie实现, 保存在服务端的键值对(形式为 {随机字符串:'xxxxxx'}), 同时在浏览器中的cookie中也对应一相同的随机字符串,用来再次请求的 时候验证: 注意 ...
- 将 flask 中的 session 存储到 SQLite 数据库中
将 flask 中的 session 存储到 SQLite 数据库中 使用 flask 构建服务器后端时,常需要在浏览器端存储 cookie 用于识别不同用户,根据不同的 cookie 判断出当前请求 ...
- Flask - 内置Session
目录 Flask - 内置Session 基本用法 给视图添加装饰器验证 Flask - 内置Session Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cook ...
随机推荐
- html冲刺
html知识点回顾与面试题<!--1.<DOCTYPE>告诉浏览器当前文档要以何种HTML或者XHTML规范解析2.语义标签strong 粗体em 斜体del 删除线ins 下划线 ...
- flask之信号和mateclass元类
本篇导航: flask实例化参数 信号 metaclass元类解析 一.flask实例化参数 instance_path和instance_relative_config是配合来用的:这两个参数是用来 ...
- 关于kafka重新消费数据问题
我们在使用consumer消费数据时,有些情况下我们需要对已经消费过的数据进行重新消费,这里介绍kafka中两种重新消费数据的方法. 1. 修改offset 我们在使用consumer消费的时候,每个 ...
- 利用Vmware 创建Linux虚拟机的方法
https://blog.csdn.net/qq_34929457/article/details/52663265 使用VMware新建一个Linux系统虚拟机 原创 2016年09月25日 17: ...
- centos7证书安全登录
生成一对密钥,本地私钥匹配线上主机的公钥进行登录,比密码登录更加安全方便. 本文适用MAC/Linux的本地环境 1.本地生成一对密钥 ssh-keygen -t rsa 2.把生成的公钥上传到线上主 ...
- jQuery CVE-2019-11358原型污染漏洞分析和修复建议
一.安全通告 jQuery官方于日前发布安全预警通告,通报了漏洞编号为 CVE-2019-11358的原型污染漏洞.由攻击者控制的属性可被注入对象,之后或经由触发 JavaScript 异常引发拒绝服 ...
- 单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区
BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存 ...
- H+ 添加(新增)Tab选项卡
//注:在contabs.js文件中 $(function () { }); 方法外 加入//注: data-name="' + menuName + '" 这句是加入的自定义属性 ...
- Android Studio集成到Genymotion模拟器
环境:Mac Android Studio 一.下载Android Studio 下载地址:http://www.android-studio.org/ 这个的安装没啥好说的了,基本的. 二.下载Ge ...
- 用.NET开发的磁力搜索引擎——btbook.net
UPDATE:目前项目已停止维护,本文仅留作纪念. 去年10月份开始研究相关的协议与资料,中途乱七八糟的事情差点没坚持下来,寒假里修修补补上礼拜把Btbook发布了,经过社交网络的推广之后,上线第三天 ...