闪现

flask提供了一个非常有用的flash()函数,它可以用来“闪现”需要提示给用户的消息,比如当用户登录成功后显示“欢迎回来!”。在视图函数调用flash()函数,传入消息内容,flash()函数把消息存储在session中,我们需要在模板中使用全局函数get_flashed_messages()获取消息并将它显示出来。

通过flash()函数发送的消息会存储在session对象中,所以我们需要为程序设置秘钥。可以通过app.secret_key属性或配置变量SECRET_KEY设置。

源码

def flash(message, category="message"):  # 默认category为message
flashes = session.get("_flashes", [])
flashes.append((category, message))
session["_flashes"] = flashes
message_flashed.send(
current_app._get_current_object(), message=message, category=category
) def get_flashed_messages(with_categories=False, category_filter=()):
flashes = _request_ctx_stack.top.flashes
if flashes is None:
_request_ctx_stack.top.flashes = flashes = (
session.pop("_flashes") if "_flashes" in session else []
)
if category_filter:
flashes = list(filter(lambda f: f[0] in category_filter, flashes))
if not with_categories:
return [x[1] for x in flashes]
return flashes
  1. 设置flash

    • flash("要传递的值",category="分类的名称"),如果不传默认是message
    • 本质:session['_flash']
  2. 取flash设置的值我们用get_flashed_messages

    • get_flashed_messages(with_categories=False, category_filter=())

      • 如果不传递 category_filter,取出上面存储的所有分类传递的值
      • 如果不传with_categories就只取值,不取分类的名字,如果传值,就获取 分类名和分类值
  3. 这个flash只能一个视图函数中取,只要有一个视图函数取过了,那其他视图函数就不能获取

    • 本质:session.pop("_flash")
    • 但是在同一个视图函数里面可以无限的取值

案例

from flask import Flask,flash,get_flashed_messages,request,redirect

app = Flask(__name__)
app.debug=True
app.secret_key = 'asdfasdf' @app.route('/index')
def index():
# 从某个地方获取设置过的所有值,并清除。
#flash('超时错误',category="x1")
flash("它过来了,你要小心")
flash("我是第二个",category="ss")
# return "ssdsdsdfsd"
return redirect('/error') @app.route('/error')
def error():
"""
展示错误信息
:return:
如果get_flashed_messages(with_category=True)
"""
#data = get_flashed_messages(category_filter=['x1'])
data=get_flashed_messages(with_categories=True,category_filter=['ss'])
data1 = get_flashed_messages(with_categories=True, category_filter=['ss'])
print(type(data))
print(data1)
return "错误信息:%s" %(data,) if __name__ == '__main__':
app.run()

中间件

本质就是把原来的执行函数又做了一层封装

注意:Flask的请求扩展就是Django的中间件。Django的中间件不是Flask的中间件

自定义局部中间件

根据装饰器


from functools import wraps def auth(func):
@wraps(func)
def inner(*args, **kwargs):
if not session.get('user'):
return redirect(url_for('login'))
ret = func(*args, **kwargs)
return ret
return inner @app.route('/login', methods=["GET", "POST"])
@auth
def login():
return "登录"

自定义全局装饰器

写在app.py中

class Middleware(object):

    def __init__(self, old):
self.old = old def __call__(self, *args, **kwargs):
print('请求前的操作')
ret = self.old(*args, **kwargs)
print('请求之后操作')
return ret if __name__ == '__main__':
app.wsgi_app = Middleware(app.wsgi_app)
app.run()

多app应用

from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simple
from flask import Flask, current_app
app1 = Flask('app01')
app2 = Flask('app02') @app1.route('/index')
def index():
return "app01" @app2.route('/index2')
def index2():
return "app2" # http://www.oldboyedu.com/index
# http://www.oldboyedu.com/sec/index2
dm = DispatcherMiddleware(app1, {
'/sec': app2,
}) if __name__ == "__main__":
run_simple('localhost', 5000, dm)

Flask--闪现、中间件、多app应用的更多相关文章

  1. Flask中路由系统、Flask的参数及app的配置

    @app.route('/', methods=['GET', 'POST']) 1. @app.route()装饰器中的参数 methods:当前URL地址,允许访问的请求方式 @app.route ...

  2. Flask小总结+实例化Flask参数以及对app的配置

    Flask 小而精 三方组件全 稳定性相对较差 1.启动: from flask import Flask app = Flask(__name__) app.run("0.0.0.0&qu ...

  3. Flask - 闪现flash

    1. 像snap一样阅后即焚,在服务器端临时存储数据的地方,如显示错误信息.(也可以用session实现) 2. Flash的底层是session做的,所以要secret_key.可以看源码 3. f ...

  4. Flask的“中间件”

    特殊装饰器 from flask import Flask,render_template,request app = Flask(__name__) @app.before_request def ...

  5. Flask之中间件

    from flask import Flask, flash, redirect, render_template, request app = Flask(__name__) app.secret_ ...

  6. flask 中xx.init_app(app)方法

    bootstrap = Bootstrap() mail = Mail() moment = Moment() db = SQLAlchemy() def create_app(config_name ...

  7. flask中db.init_app(app)讲解

    http://www.pythondoc.com/flask/extensiondev.html http://www.pythondoc.com/flask/extensiondev.html#fl ...

  8. Flask 请求中间件、错误处理、标签、过滤器、CBV

    目录 一.请求中间件 二.请求中间件额外方法(重写源码) 三.请求错误处理 四.请求标签.过滤器 五.CBV写法 基础版 常用版 一.请求中间件 中间件: 1 before_first_request ...

  9. Falsk的模板分配和蓝图、定制错误信息、 和补充

    Flask的模板渲染: Flask的模板在进行渲染的时候是默认选则templates下的html文件 我们可以在实例化app的时候,指定文件来进行选择: 模板渲染更改文件夹:template_fold ...

  10. Flask蓝图,Session,闪现,中间件等

    Session 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设 ...

随机推荐

  1. JDK内置工具命令

    javap Java反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件用法:javap 用法 描述 javap -help —help -? 输出此用法消息 javap -versi ...

  2. Flask(Jinja2) 服务端模板注入漏洞(SSTI)

    flask Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 wdb 应用程序可以使一些 web 页面.博客.wiki.基于 we ...

  3. iOS 国际本地化(对新项目集成和已有项目集成)

    第一推荐一篇金先生的博客,受益非浅,在这里真诚的感谢 https://www.jianshu.com/p/7cb0fad6d06f金小白 首先金小白先生把两种方式都做了介绍,第一种我就不在过多详细的讲 ...

  4. 【LeetCode】58.最后一个单词的长度

    最后一个单词的长度 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例 ...

  5. HiGV ui代码流程

    在海思PDT_Init下有一个这样的函数HI_PDT_UI_Init(): 1. HI_PDT_UI_Init()函数: /*public, it should be called by main() ...

  6. Multi-touch (MT) Protocol 小结

    1, 两种多点触摸协议: A类: 处理无关联的接触: 用于直接发送原始数据: B类: 处理跟踪识别类的接触: 通过事件slot发送相关联的独立接触更新. 2, 触摸协议的使用: A类协议: A类协议在 ...

  7. CentOS7破解root密码

    第一步: reboot重启系统,进入修改密码步骤,出现此界面后,按e进行编辑 2.找到linux16这一段中的 ro  crashkernel=xxx, 将 ro 改成rw init=/sysroot ...

  8. C学习笔记(7)--- typedef,输入输出

    1.typedef: C 语言提供了 typedef 关键字,您可以使用它来为类型(type)取一个新的名字. 比如: typedef unsigned char BYTE; 然后你就可以把BYTE当 ...

  9. mysql里字符集的配置

    [client]default-character-set=utf8[mysqld]character-set-server = utf8[mysql]default-character-set=ut ...

  10. ACM-ICPC 2018 焦作网络赛

    题目顺序:A F G H I K L 做题链接 A. Magic Mirror 题意:判断 给出的 字符串 是否等于"jessie",需要判断大小写 题解:1.用stl库 tolo ...