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 ...
随机推荐
- JS自学笔记05
JS自学笔记05 1.例题 产生随机的16进制颜色 function getColor(){ var str="#"; var arr=["0","1 ...
- Hibernate(9)_双向n对n
1.概述 ①双向 n-n 关联需要两端都使用集合属性 ②双向n-n关联必须使用连接表 ③集合属性应增加 key 子元素用以映射外键列, 集合元素里还应增加many-to-many子元素关联实体类 ④在 ...
- linux bash timeout
http://www.digitalinternals.com/unix/unix-linux-run-command-with-timeout/500/ There are two ways to ...
- vs 2017 community中文版下载地址
https://my.visualstudio.com/Downloads?pid=2190 SHA1: 109C6646A79844D8116DADB293A0B64754363C69 File n ...
- PL/SQL学习笔记之事务
一:事务自动提交的开启与关闭 1)开启事务自动提交:则每一个INSERT,UPDATE或DELETE命令执行时,都提交一次事务. SET AUTOCOMMIT ON; 2)关闭事务自动提交:则执行到C ...
- NodeJs之fs
NodeJs版本:4.4.4 fs的实用方法 查看文件信息(fs.stat) 定义:fs.stat(path, callback) var fs = require('fs'); fs.stat('t ...
- 一次python 内存泄漏解决过程
最近工作中慢慢开始用python协程相关的东西,所以用到了一些相关模块,如aiohttp, aiomysql, aioredis等,用的过程中也碰到的很多问题,这里整理了一次内存泄漏的问题 通常我们写 ...
- 转:图像处理、显示中的行宽(linesize)、步长(stride)、间距(pitch)
在图像数据传输和显示的过程中有一个不常用的参数:间距. 间距的名称: 它有很多的别名,在使用d3d显示的时候,它叫pitch:在用ffmpeg解码的时候,它叫linesize: 在用ffmpeg转换格 ...
- C# 参数签名字符串按 ASCII码排序,注意其中的坑
参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...
- idea系列ide给git增加push按钮
第一步 打开设置 Appearance & Behavior -- Menus and ToolBars,选中VscNavBarToolBarActios,然后点击"+"添 ...