Flask 快速使用 进阶—— (2)
案例:可配置发送信息的系统
假如我们有这样的一个系统,可以发送短息,邮件和微信,后期可能还会增加一些平台,怎么才可以做到快速切换的去使用某种功能呢,在这里我会通过在配置文件中简单的配置就可以实现
在项目的根目录下创建 utils/message/base.py 创建继承的基类,强制其子类实现send() 方法
该系统可适用于 各种缓存系统
class Base(object):
def send(self,msg):
raise NotImplementedError('...')
在项目的根目录下创建 utils/message/email.py 实现发送邮件的类
from .base import Base class Email(Base):
"""
发送邮件提醒相关
"""
def __init__(self):
"""
邮箱相关数据初始化
"""
self.username = 'asdf'
self.pwd = 'asdf' def send(self,msg):
print('email')
在项目的根目录下创建 utils/message/msg.py 实现发送短息的类
from .base import Base class Msg(Base):
"""
发送短信提醒相关
""" def __init__(self):
"""
短信相关数据初始化
"""
self.username = 'asdf'
self.pwd = 'asdf' def send(self, msg):
print('msg')
在项目的根目录下创建 utils/message/wechat.py 实现发送微信的类
from .base import Base
class WeChat(Base):
def send(self,msg):
print('weixin')
在项目的根目录下创建 utils/message/__init__.py 通过读取配置文件配置信息,动态的导入和执行send()方法
import settings
import importlib def send_msgs(msg): for path in settings.MSG_LIST:
m,c = path.rsplit('.',maxsplit=1) # 从右边开始分割 utils.message.wechat WeChat
md = importlib.import_module(m)
obj = getattr(md,c)()
obj.send(msg)
在项目的根目录下创建 settings.py 配置文件信息
MSG_LIST = [
"utils.message.email.Email",
"utils.message.msg.Msg",
"utils.message.wechat.WeChat",
]
在项目文件下创建主程序app.py
from flask import Flask,request
from utils.message import send_msgs
app = Flask(__name__)
@app.route('/')
def index():
send_msgs('.....')
return 'Hello World!'
if __name__ == '__main__':
app.run()
访问
http://127.0.0.1:5000、
后台打印数据如下

闪现
在服务端可以对数据进行临时的存储,本质是基于session做的,取的时候清除
from flask import Flask,flash,get_flashed_messages app = Flask(__name__)
app.secret_key = 'asdfasdf'
@app.route('/get')
def get():
# 从某个地方获取设置过的所有值,并清除。
data = get_flashed_messages()
print(data)
return 'Hello World!' @app.route('/set')
def set():
# 向某个地方设置一个值
flash('阿斯蒂芬') return 'Hello World!' if __name__ == '__main__':
app.run()
简单的小应用
from flask import Flask,flash,get_flashed_messages,request,redirect app = Flask(__name__)
app.secret_key = 'asdfasdf' @app.route('/index')
def index():
# 从某个地方获取设置过的所有值,并清除。
val = request.args.get('v')
if val == 'oldboy':
return 'Hello World!'
flash('超时错误',category="x1")
return "ssdsdsdfsd" @app.route('/error')
def error():
"""
展示错误信息
:return:
"""
data = get_flashed_messages(category_filter=['x1'])
if data:
msg = data[0]
else:
msg = "..."
return "错误信息:%s" %(msg,) if __name__ == '__main__':
app.run()
请求扩展
1 before_request 在每次请求前执行 2 after_request在每次请求后执行,必须有返回值
可以定义多个,before_request 按代码的顺序一次执行,after_request按代码的顺序逆序执行
注意请求假如没通过,被拦截,所有的response还会被执行
from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.debug = True
app.secret_key = 'siuljskdjfs' @app.before_request
def process_request1(*args,**kwargs):
print('process_request1 进来了') @app.before_request
def process_request2(*args,**kwargs):
print('process_request2 进来了') @app.after_request
def process_response1(response):
print('process_response1 走了')
return response @app.after_request
def process_response2(response):
print('process_response2 走了')
return response @app.errorhandler(404)
def error_404(arg):
return "404错误了" @app.before_first_request
def first(*args,**kwargs):
pass @app.route('/index',methods=['GET'])
def index():
print('index函数')
return "Index" if __name__ == '__main__':
app.run()
访问
http://127.0.0.1:5000/index
后台打印如下

基于请求做的登陆的认证
from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.secret_key = 'siuljskdjfs' @app.before_request
def process_request(*args,**kwargs):
if request.path == '/login':
return None
user = session.get('user_info')
if user:
return None
return redirect('/login') @app.route('/detail/')
def detail():
return '详情' @app.route('/index')
def index():
return '主页' @app.route('/login',methods=['GET','POST'])
def login():
session['user_info'] = 'zhang'
return '登陆成功' if __name__ == '__main__':
app.run()
中间键
flask 每次请求进来都会执行app.__call__方法中的 wsgi_app方法,我们可以对其中的 wsgi_app 进行封装
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World!'
class Md(object):
def __init__(self,old_wsgi_app):
self.old_wsgi_app = old_wsgi_app
def __call__(self, environ, start_response):
print('开始之前')
ret = self.old_wsgi_app(environ, start_response)
print('结束之后')
return ret
if __name__ == '__main__':
app.wsgi_app = Md(app.wsgi_app)
app.run()
访问
http://127.0.0.1:5000/
测试结果如下

简单的定制错误信息
@app.errorhandler(404)
def error_404(arg):
return "404错误了"
模板中的定制方法
from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.secret_key = 'siuljskdjfs' @app.template_global()
def sb(a1, a2):
return a1 + a2 @app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3 @app.route('/login')
def login():
return render_template('login.html')
if __name__ == '__main__':
app.run()
templates/login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ 1|db(2,3)}}</h1>
<h1>{{sb(1,2)}}</h1>
</body>
</html>
输入以下地址
http://127.0.0.1:5000/login
测试结果如下

Flask 快速使用 进阶—— (2)的更多相关文章
- Flask快速入门
flask快速入门 1.1.三种框架比较 Django: 重武器,内部包含了非常多组件:ORM.Form.ModelForm.缓存.Session.中间件.信号等 Flask:短小精悍,内部没有太多组 ...
- 02 flask源码剖析之flask快速使用
02 flask快速使用 目录 02 flask快速使用 1.flask与django的区别 2. 安装 3. 依赖wsgi Werkzeug 4. 快速使用flask 5. 用户登录&用户管 ...
- docker&flask快速构建服务接口(二)
系列其他内容 docker快速创建轻量级的可移植的容器✓ docker&flask快速构建服务接口✓ docker&uwsgi高性能WSGI服务器生产部署必备 docker&g ...
- 【Flask】Flask快速玩框架
最近比较忙 快速玩Flask框架,为微博做些准备 part 1 python程序 from flask importFlask, render_template, session, redirect, ...
- 【转】Flask快速入门
迫不及待要开始了吗?本页提供了一个很好的 Flask 介绍,并假定你已经安装好了 Flask.如果没有,请跳转到 安装 章节. 一个最小的应用 一个最小的 Flask 应用看起来会是这样: from ...
- Flask快速入门,知识整理
一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...
- 【先验知识归纳】Flask快速入门
本文参考:快速入门 - Flask 0.10.1 文档 路由 Flask使用route修饰器来关联URL与程序函数: @app.route('/') def hello_world(): return ...
- Flask (四) 模型进阶
模型进阶 多对多关联 用户收藏电影,一个用户可以收藏多部电影, 一部电影可以被不同的用户收藏, 是一个多对多关系. # 中间表(不是模型) collects = db.Table('collect ...
- Flask官方文档学习-flask快速入门
环境搭建 下载安装Python3:www.python.org 终端运行命令:python3 -m venv flask_dev,来创建虚拟环境 启用虚拟环境,终端使用命令 source /flask ...
随机推荐
- 第45章 工具 - Identity Server 4 中文文档(v1.0.0)
该IdentityServerTools是为IdentityServer编写扩展代码时,你可能需要有效的内部工具的集合.要使用它,请将其注入代码,例如控制器: public MyController( ...
- [PHP] 适配器模式的日常使用
适配器模式就是将一个类的接口方法转换成我希望用的另一个方法 , 下面是个常见的用处 class Session{ public $mc; public function __construct(){ ...
- IOS自带输入法中文不触发KEYUP事件导致vue双向绑定错误问题
先上图: 可以看到输入框中的内容和弹出框的内容不一致, <input class="am-fr labRight" id="txcode" type=&q ...
- 命令行BASH的基本操作
前面说了,我们要尽量少用GNOME图形界面,而应该以使用BASH命令行为主. SHELL Shell是操作系统内核的壳,因为我们不能直接操作系统的内核Kernel,只能通过Shell去操作,Shell ...
- Fundebug前端JavaScript插件更新至1.7.1,拆分录屏代码,还原部分Script error.
摘要: BUG监控插件压缩至18K. 1.7.1拆分了录屏代码,BUG监控插件压缩至18K,另外我们还原了部分Script error,帮助用户更方便地Debug.请大家及时更新哈~ 拆分录屏代码 从 ...
- 手机端两端对齐,兼容ios,安卓
.div-title p label{ text-align: justify; width: 18%; display: inline-block; text-align-last: justify ...
- TCP客户端
TCP通信客户端-解决数据包接收不全的过程 背景:5个串口条码枪,通过MOXA Nport系列转换器,以TCPServer的形式推送扫描到的条码到客户端.5个条码枪均位于流水线上方的支架上,流水线货物 ...
- iOS----------使用cocoapods遇到的问题
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad ...
- 在angular 6中使用 less
在angular 6中使用 less 新项目 ng new [appname] --style less 已有的项目 修改 *.css 文件及引用处后缀名为 less并在 angular.json 文 ...
- DedeCMS清空删除所有文档后新建文档信息ID从1开始
方法一.登录织梦后台,找到系统->系统设置->SQL命令行工具 分别运行以下命令: 清除表中的数据,删除所有文章: truncate table `dede_arctiny`; trunc ...