Session:

  1. Flask 默认将 session 以加密的形式放到了浏览器的 cookie
  2. Flask session 就是一个字典,字典有什么方法 session 就有什么方法
  3. flask session 原理:当请求刚进来时,flask会读取cookie session(配置文件中能改这个名称) 对应的值,将这个值解密并反序列化成为一个字典放入内存,
  4. 以便视图函数使用;
  5. 在视图函数中使用时,按照字典的方法使用;
  6. 当请求结束时,flask会读取内存中字典的值,进行序列化+加密,然后再写入到用户的 cookie

flash:

  1. # flash 是 取一次就没有;基于 session 实现的
  2. # 原理:在 session 中存储一个数据,读取时通过 pop 将数据移除,从而达到只能取一次的效果
  3. from flash import get_flashed_messages
  4. flash("临时数据存储","error") # 存 flash;"error" 表示分类
  5. get_flashed_messages() # 取 flash 中的值;列表的形式; get_flashed_messages(category_filter=["error"]) 表示根据 分类取 flash

特殊装饰器:(重点)

  1. **1. @app.before_request # 所有请求之前进行的操作;被装饰的函数没有 参数 和 返回值;作用类似于 Django 的 process_request
  2. 2. @app.template_global() # 给模板用的
  3. 3. @app.template_filter() # 给模板用的
  4.  
  5. **4. @app.after_request # 被装饰的函数要有 参数 和 返回值;作用类似于 Django 的 process_response
  6.  
  7. @app.after_request
  8. def test(response):
  9. print("after_request")
  10. return response
  11. # 对于有多个 @app.before_request ,谁先定义谁先执行;对于有多个 @app.after_request ,谁先定义谁后执行;类似于 Django 中间件的执行顺序
  12.  
  13. # 对于 before_request,可以在定义自己逻辑时添加返回值,这样就不会执行后面的 before_request 和 视图,但还会执行所有的 after_request;这是和 Django(1.10以后版本不一样的地方)
  14.  
  15. 5. @app.before_first_request # 只有第一次请求才执行
  16. 6. @app.errorhandler(错误码) # 报错的时候执行的函数;可用于定制错误信息(页面)
  17.  
  18. @app.errorhandler(404)
  19. def not_found(arg): # arg 是错误信息
  20. print(arg)
  21. return "没找到"

Blueprint:蓝图

示例目录:

  1. crm
  2. |---crm
  3. |--- __init__.py # 实例化 Flask 等等
  4. |---views
  5. |---account.py
  6. |---user.py
  7. |---manage.py # 入口函数

manage.py

  1. from crm import create_app
  2.  
  3. app = create_app()
  4.  
  5. if __name__ == '__main__':
  6. app.run() # 运行 Flask 的实例

crm/__init__.py

  1. from flask import Flask
  2. from .views.account import ac
  3. from .views.user import uc
  4.  
  5. def create_app():
  6.  
  7. app = Flask(__name__)
  8.  
  9. # @app.before_request # 全局性的 before_request
  10. # def x1():
  11. # print('app.before_request')
  12.  
  13. app.register_blueprint(ac)
  14. app.register_blueprint(uc,url_prefix='/api') # 给 uc 这个蓝图的 url 添加一个 前缀
  15. return app

crm/views/account.py

  1. from flask import Blueprint,render_template
  2.  
  3. ac = Blueprint('ac',__name__) # 实例化一个蓝图
  4.  
  5. @ac.before_request # 只给 ac 这个蓝图添加 before_request
  6. def x1():
  7. print('app.before_request')
  8.  
  9. @ac.route('/login')
  10. def login():
  11. return render_template('login.html')
  12.  
  13. @ac.route('/logout')
  14. def logout():
  15. return 'Logout'

crm/views/user.py

  1. from flask import Blueprint
  2.  
  3. uc = Blueprint('uc',__name__)
  4.  
  5. @uc.route('/list')
  6. def list():
  7. return 'List'
  8.  
  9. @uc.route('/detail')
  10. def detail():
  11. return 'detail'

蓝图的作用:

  1. 1. 目录结构的划分
  2. 2. 路径加前缀
  3. 3. 给某些应用(视图)加装饰器

路由的正则匹配:

  1. # 1. 先定义一个类: RegexConverter(BaseConverter)
  2. # 2. app.url_map.converters["reg"] = RegexConverter
  3. # 3. 用户发送请求
  4. # 4. 使用自定义正则:
  5. @app.route("/index/<reg('\d+'):nid>")
  6. def index(nid):
  7. print(nid,type(nid)
  8. print(url_for('index',nid=987) # 返回生成url时,自动触发 RegexConverter 的 to_url 方法
  9. # 4. flask内部进行正则匹配
  10. # 5. to_python 方法的返回值会交给视图函数的参数

上下文管理:

  1. 1. request
  2. 2. session # 注: Flask 默认将 session 以加密的形式放到了浏览器的 cookie 里面
  3. 3. app
  4. 4. g

请求--视图--响应 大致流程:

  1. 请求到来时:
  2. # ctx = RequestContext(self,environ) # self 是 app对象,environ表示请求相关的原始数据
  3. # ctx.request = Request(environ)
  4. # ctx.session = None
  5.  
  6. # 将包含了 request和session 的ctx对象打包放到某个地方(相当于一个大字典;根据线程或协程加个唯一标识,放进去的,所以数据相互隔离)
  7. {
  8. 1232:{ctx:ctx对象},
  9. ...
  10. }
  11. 视图函数:
  12. from flask import request,session
  13. # 上述代码背后的过程:根据当前线程或者协程的唯一标识,取到 ctx对象,然后取到 request和session
  14. 请求结束:
  15. 根据当前线程的唯一标识,将 大字典 中该线程对应的数据移除

上下文管理--request:

  1. # 1. wsgi:初步处理请求
  2. # 2. __call__ 方法 --> wsgi_app 方法
  3. # 3. wsgi_app方法:
  4. ctx = RequestContext(session,request)
  5. ctx.push()
  6. # 4. LocalStack:把 ctx 对象添加到 Local 中 (LocalStack起到一个中介的作用:把 Local 中的数据维护成一个栈;视图函数取值时也是来 LocalStack 中取值,而不能直接去 Local 中取)
  7. # 5. Local:为每个线程或协程开辟一块相互隔离的内存空间; local对象中有一个 __storage__ 的字典
  8. __storage__ = {
  9. 线程/协程唯一标识:{"stack":[ctx对象(requestsession),]}
  10. }

上下文管理--session:

  1. # 通过 LocalStack 获取 ctx 中的 session,给 session 赋值(从 cookie 中读取数据,进行解密和反序列化;调用 open_session() 方法)

补充:

  1. # Flask 和 Django 对比:
  2. 相同点:都是基于 wsgi 协议写的
  3. 最大不同点:request的机制不同:请求相关的数据,对于Django是通过参数传递一个一个传递过来的;flask是把请求相关的数据放到“一个地方”(大字典),以后就来这里取对应的数据
  4.  
  5. # 全局变量只有在初次加载时执行
  6. # 类中的 __slots__() 的作用:只允许该类的实例添加 __slots__ () 中的属性

flask-session:

  1. # Flask 第三方组件--flask-session:可将 session 保存到 redis 中

安装:

  1. pip install flask-session

使用:

  1. import redis
  2. from flask import Flask,request
  3. from flask_session import Session # 导入 flask-session 中的 Session
  4.  
  5. app = Flask(__name__)
  6.  
  7. app.config["SESSION_TYPE"] = "redis" # 3. 由下面的分析可知,配置文件中应该要先配置好 SESSION_TYPE; 此时 app.session_interface = RedisSessionInterface();RedisSessionInterface 中也有 open_session 和 save_session 这两个方法
  8. app.config["SESSION_REDIS"] = redis.Redis(host="127.0.0.1",port=6379,password="") # 4. 配置 session 的 Redis
  9. # 通过这些操作, session 就会保存到 redis 中;此时保存在 浏览器中的 cookie 是一个 随机字符串(uuid.uuid4()),当请求到达时 通过这个 cookie(随机字符串)来 redis 中取 session
  10.  
  11. # 1. flask 默认的 session 处理是通过 app.session_interface = SecureCookieSessionInterface()
  12. Session(app)
  13. # 2. app 经过 Session 实例化之后,app.session_interface = self._get_interface(app) ; session 保存到哪和 配置文件中的 "SESSION_TYPE" 有关
  14.  
  15. pass

Flask基础(3):session、flash、特殊装饰器、蓝图、路由正则匹配、上下文管理 & flask-session的更多相关文章

  1. Flask上下文管理、session原理和全局g对象

    一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...

  2. Flask(2)- 装饰器的坑及解决办法、flask中的路由/实例化配置/对象配置/蓝图/特殊装饰器(中间件、重定义错误页面)

    一.装饰器的坑以及解决方法 1.使用装饰器装饰两个视图函数,代码如下 from flask import Flask, redirect, render_template, request, sess ...

  3. flask模板语言,装饰器,路由及配置

    1.模板语言jinja2 Flask中默认的模板语言是Jinja2 1.0 模板传参 from flask import Flask,render_template app = Flask(__nam ...

  4. Flask之基于route装饰器的路由系统(源码阅读解析)

    一 路由系统 1. 在flask中配置URL和视图函数的路由时,首先需要在main.py中实例化一个app对象: from flask import Flask, render_template ap ...

  5. Python day15装饰器基本理论,以及结合全局变量模拟session

    装饰器(decorator):为其他函数添加附加功能 原则:1.不修改被修饰函数源代码 2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 import time def timmer( ...

  6. Python开发基础-Day7-闭包函数和装饰器基础

    补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...

  7. python 基础篇 11 函数进阶----装饰器

    11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...

  8. python基础之闭包函数和装饰器

    补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...

  9. python基础补漏-05-生成器和装饰器

    [1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...

随机推荐

  1. C#画图——Graphics

    C#要实现简单的画图功能可以利用Graphics这个类,要使用Graphics必需using命名空间System.Drawing(此名明空间下都是关于图形的操作).首先创建画布: Bitmap bmp ...

  2. Java多线程学习---------超详细总结(java 多线程 同步 数据传递 )

    目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么 ...

  3. 转 PHP in_array() 函数

    实例 在数组中搜索值 "Glenn" ,并输出一些文本: <?php $people = array("Bill", "Steve", ...

  4. hbase源码分析:ERROR: Table already exists问题诊断

    问题描述: 重新安装了测试环境的hadoop,所以之前hbase所建的表数据都丢失了,但是zookeeper没有动.在hbase shell中list的时候,看不到之前建的表,但是create tes ...

  5. 5 月编程语言排行榜:Java第一,R跌出Top20

    我们都知道,最近,TIOBE 发布了 5 月份编程语言排行榜.其中,前三名依然健稳不变,他们分别是 Java.C.C++,第四则为: Python ,第五则为 VB .NET. 下面两张图,我们可以看 ...

  6. 直接插入排序法原理及其js实现

    直接插入排序法就像我们打扑克牌时整理牌面一样,先让我们脑补一下我们打牌的过程. 首先摸了一张6, 接着摸到一张4,比6小,插到6的前面: 又摸到一张7,比6大,插到6的后面: 又摸到一张5,比6小,比 ...

  7. TinyMCE编辑器

    TinyMCE编辑器下载地址   http://www.tinymce.com/download/download.php

  8. 如何向妻子解释OOD (转)

       此文译自CodeProject上<How I explained OOD to my wife>一文,该文章在Top Articles上排名第3,读了之后觉得非常好,就翻译出来,供不 ...

  9. 浮动qq客服备份代码

    <div class="main-im"> <div id="open_im" class="open-im"> & ...

  10. Java处理ZIP文件的解决方案——Zip4J(不解压直接通过InputStream形式读取其中的文件,解决中文乱码)

    一.JDK内置操作Zip文件其实,在JDK中已经存在操作ZIP的工具类:ZipInputStream. 基本使用: public static Map<String, String> re ...