[flask]flask_login模块,session及其他
读flask源码的时候,有一点一直到现在都没有一个清晰的概念,比如四个全局变量g,current_app,session,request是怎么做到的
按照查到的资料里面的说法,为了不至于每次都主动调用函数去获取请求值,所以在flask里面用了设计模式中的Proxy,在flask中用到了LocalProxy对四个全局变量进行代理,同时为了让其在多线程中可以访问,使用了类LocalStack,然后这四个变量都绑定到这个LocalStack的一个实例上面,就比如_request_ctx_stack,而这个类实现了把不同的请求绑定到不同的线程上面或者协程上面。然后就实现了不同请求的全局可用变量。
但是看源码,这四个变量的生成方式是一样的,又怎么实现flask文档里面说的这些呢?
比如:
session: A session basically makes it possible to remember information from one request to another.
g:....
还有flask_login 源码中的login_user和logout_user,除了用到了session,还把当前用户绑定到了_request_ctx_stack,为什么,不绑定不行吗?
from flask import Flask, session, request
app = Flask(__name__)
app.secret_key = '~\xc8\xc6\xe0\xf3,\x98O\xa8z4\xfb=\rNd' @app.route('/login')
def login():
uid = request.args.get('uid')
psw = request.args.get('psw')
if uid and psw:
session['uid'] = uid
session['_login'] = True
return '<h1>login succeed!</h1>'
return '<h1>login failed</h1>' @app.route('/logout')
def logout():
if 'uid' in session:
session.pop('uid')
if '_login' in session:
session.pop('_login')
return '<h1>logout succeed</h1>'
return '<h1>logout failed<h1>' @app.route('/test_login')
def tst():
if 'uid' in session:
return '<h1>you are still in</h1>'
else:
return '<h1>you have logouted</h1>'
if __name__ == '__main__':
app.run(debug=True)
同时分别用chrome和firefox去登录退出,证明是可以的,互不干扰,但是flask_login源码离那样写是基于什么考虑呢??
写的很乱,先留下个问题吧
参考资料:
http://flask.pocoo.org/docs/0.10/api/#flask.request
https://flask-login.readthedocs.io/en/latest/
https://zhuanlan.zhihu.com/p/24629677
http://www.zlovezl.cn/articles/charming-python-start-from-flask-request/
[flask]flask_login模块,session及其他的更多相关文章
- flask 状态保持session和上下文session的区别
问题场景: 在falsk项目中导入了两个session: 首先,配置文件config.py文件中 有个 flask_session扩展导入了Session ( from flask_sessi ...
- flask总结之session,websocket,上下文管理
1.关于session flask是带有session的,它加密后存储在用户浏览器的cookie中,可以通过app.seesion_interface源码查看 from flask import Fl ...
- 将 flask 中的 session 存储到 SQLite 数据库中
将 flask 中的 session 存储到 SQLite 数据库中 使用 flask 构建服务器后端时,常需要在浏览器端存储 cookie 用于识别不同用户,根据不同的 cookie 判断出当前请求 ...
- Flask基础之session验证与模板渲染语法(jinja2)
目录 1.http传输请求头参数 2.Flask中request.data参数处理 3.Flask中request.json参数 4.Flask中的session管理 5.Flask中模板语法(if, ...
- Flask的插件session、SQLAlchemy、Script、Migrate
一.flask-session 1.为什么要使用flask-session 因为flask默认的session是通过请求上下文放入到Local中的,是存在内存的,而使用flask-session可以更 ...
- flask基础之session原理详解(十)
前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...
- flask中cookie,session的存储,调用,删除 方法(代码demo)
# -*- encoding: utf-8 -*- # cookie,session的存储,调用,删除 from flask import Flask,make_response,request,se ...
- Flask 上下文管理-- (session,request,current_app的传递)--类似本地线程实现,以及多app应用
Flask session,request,current_app的传递 请求上下文的作用 -- 封装请求相关得数据(request,session) 请求上下文 request session re ...
- Flask中的session ,自定义实现 session机制, 和 flask-session组件
session 是基于cookie实现, 保存在服务端的键值对(形式为 {随机字符串:'xxxxxx'}), 同时在浏览器中的cookie中也对应一相同的随机字符串,用来再次请求的 时候验证: 注意 ...
随机推荐
- LintCode 383: Max Area
LintCode 383: Max Area 题目描述 给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai).画 n 条垂直线,使得 i 垂直线的两个端点 ...
- laravel 带条件的分页查询
laravel 带条件的分页查询, 原文:http://blog.csdn.net/u011020900/article/details/52369094 bug:断点查询,点击分页,查询条件消失. ...
- Python基础入门(一)
1.在线教程 2.Python下载地址,安装步骤,就是next.next... 3.配置环境变量(win8) 电脑 --> 属性 --> 高级系统设置 --> 环境变量,找到系统变量 ...
- Python练习-无参装饰器的正确打开方式
import time def DecoUserPrint(UserFunc):#定义一个DecoUserPrint接收参数的多重方法 def DecoPrint(): StartTime = tim ...
- BOOST 之filesystem, path
目录[-] 使用 boost::filesystem 的第一个程序 清单 1. 用于确定某个文件的类型是否为 Directory 的代码 了解 Boost path 对象 清单 2. 创建 Boost ...
- GridView Postback后出错Operation is not valid due to the current state of the object.
一.问题起因 最近项目中有一页面第一次search后正常,但是再次点击其它任何按钮都会报错,亦即postback后页面有问题,经检查是由于页面有一GridView且数据量极大,记录大概有上千条,这儿解 ...
- 002_安装第三方APP好的站点及解除安全与隐私限制
一.解除安全与隐私限制的任何来源. http://bbs.feng.com/read-htm-tid-10714286.html 接下来,我们就打开终端,然后输入以下命令: sudo spctl ...
- Java 并发--线程创建
随着处理器的多核化,为提高处理器的资源利用率应用程序的并发变应运而生了.现在的操作系统是多任务操作系统,多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的内存空间 ...
- json在线工具
1.json在线格式化工具 http://www.choujone.com/json/ 2.json在线比较工具 http://tlrobinson.net/projects/javascript-f ...
- sem_open中信号量命名
问题: sem_open will failed with "No such file or directory" 解释1: 这是由于在Linux内核中,创建信号量的默认路径是 ...