Flask--闪现、中间件、多app应用
闪现
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
设置flash
flash("要传递的值",category="分类的名称")
,如果不传默认是message- 本质:
session['_flash']
取flash设置的值我们用
get_flashed_messages
get_flashed_messages(with_categories=False, category_filter=())
- 如果不传递
category_filter
,取出上面存储的所有分类传递的值 - 如果不传with_categories就只取值,不取分类的名字,如果传值,就获取 分类名和分类值
- 如果不传递
这个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应用的更多相关文章
- Flask中路由系统、Flask的参数及app的配置
@app.route('/', methods=['GET', 'POST']) 1. @app.route()装饰器中的参数 methods:当前URL地址,允许访问的请求方式 @app.route ...
- Flask小总结+实例化Flask参数以及对app的配置
Flask 小而精 三方组件全 稳定性相对较差 1.启动: from flask import Flask app = Flask(__name__) app.run("0.0.0.0&qu ...
- Flask - 闪现flash
1. 像snap一样阅后即焚,在服务器端临时存储数据的地方,如显示错误信息.(也可以用session实现) 2. Flash的底层是session做的,所以要secret_key.可以看源码 3. f ...
- Flask的“中间件”
特殊装饰器 from flask import Flask,render_template,request app = Flask(__name__) @app.before_request def ...
- Flask之中间件
from flask import Flask, flash, redirect, render_template, request app = Flask(__name__) app.secret_ ...
- flask 中xx.init_app(app)方法
bootstrap = Bootstrap() mail = Mail() moment = Moment() db = SQLAlchemy() def create_app(config_name ...
- flask中db.init_app(app)讲解
http://www.pythondoc.com/flask/extensiondev.html http://www.pythondoc.com/flask/extensiondev.html#fl ...
- Flask 请求中间件、错误处理、标签、过滤器、CBV
目录 一.请求中间件 二.请求中间件额外方法(重写源码) 三.请求错误处理 四.请求标签.过滤器 五.CBV写法 基础版 常用版 一.请求中间件 中间件: 1 before_first_request ...
- Falsk的模板分配和蓝图、定制错误信息、 和补充
Flask的模板渲染: Flask的模板在进行渲染的时候是默认选则templates下的html文件 我们可以在实例化app的时候,指定文件来进行选择: 模板渲染更改文件夹:template_fold ...
- Flask蓝图,Session,闪现,中间件等
Session 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设 ...
随机推荐
- 记一次asp.net core 在iis上运行抛出502.5错误
asp.net core 在iis上运行抛出502.5异常的部分原因以及解决方案 环境说明 已安装 .net core runtime 2.1.401 已安装 .net core windows ho ...
- Vue笔记--通过自定义指令实现按钮操作权限
经常做中后台系统,此类系统的权限是比较重要,拿自己做过的一些项目做个笔记. Vue实现的中后台管理系统.按钮操作权限的空置一般都是通过自定义指令Vue.directive. <el-button ...
- js 时分秒转化为秒
var time = '00:02:10'; var hour = time.split(':')[0]; var min = time.split(':')[1]; var sec = time.s ...
- 【LeetCode】746. 使用最小花费爬楼梯
使用最小花费爬楼梯 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或 ...
- [转]Redis之(一)初识Redis
原文地址:http://blog.csdn.net/u012152619/article/details/52550315 Redis之(一)初识Redis 标签: Redisredis-server ...
- MSSQL添加外键
alter table 需要建立外键的表 with check/nocheck add constraint 外键名字 foreign key (需要建立外键的字段名) references 外键表( ...
- XposedInstaller 是如何安装的
Launcher 如何通过startActivity 传送一个 intent 到 zygote 如何 接收到它并且 fork出该app的进程的? 安装框架的时候会现有各种检查,比如当前系统版本等 下载 ...
- HashMap底层实现及原理
注意:文章的内容基于JDK1.7进行分析.1.8做的改动文章末尾进行讲解. 一.先来熟悉一下我们常用的HashMap: 1.HashSet和HashMap概述 对于HashSst及其子类而 ...
- 第50 课C++对象模型分析——成员变量(上)
C++对象模型,其实就是C++中的对象在内存中是如何排布的.C++中的对象包含了成员变量和成员函数,其实就是研究C++中的类对象它的成员变量和成员函数在内存中是如何排布的. 回归本质class 是一种 ...
- SecureCRT自动断开连接的解决方法
方法一: 在普通用户下,输入重启sshd服务的命令:service sshd restart 这时会提示:管理系统服务或单元需要身份验证.解决的方法:先要切换为root用户,接着重启sshd服务:se ...