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 ...
随机推荐
- Java开发笔记(十七)各得其所的多路分支
前面提到条件语句的标准格式为“if (条件) { /* 条件成立时的操作代码 */ } else { /* 条件不成立时的操作代码 */ }”,乍看之下仿佛只有两个分支,一个是条件成立时的分支,另一个 ...
- Java消息中间件----ActiveMQ入门①
一 首先到ActiveMQ下载安装包 Active官网地址http://activemq.apache.org/activemq-5150-release.html 如图所示,有两个下载的链接,我们下 ...
- Android Studio 学习(七)通知
导入support- -v4 1.进入 file-project structure 2.左边选择app 3.右边选择dependencies 4.左下角可以看到一个加号,点击选择Library de ...
- C#网络请求与JSON解析
最新学校的海康摄像头集控平台(网页端)不能在win10里登录,我寻思着拿海康的c# demo直接改. 首先得解决权限问题,每个教师任教不同年级,只能看到自己所在年级的设备,涉及到登录,在此记录一下C# ...
- JAVA forname classnotfoundexception 错误
今日在使用Class.forName方法的时候报了错误: JAVA forname classnotfoundexception 原因是Class.forName(className);里面的clas ...
- Mysql学习路线
本文内容: mysql学习路线 首发日期:2018-04-19 由于现在很多都是有api了,很多问题都转接到编程语言上来处理了,所以这篇mysql之路仅仅是作为“了解”之用.不深究mysql. 很多东 ...
- Rsync客户端卡死的问题查询
简介 某备份系统大量使用rsync来传输文件,但是偶尔会出现rsync客户端在上传数据的时候长时间卡死,本文记录了解决问题的步骤. 本文只涉及rsync客户端中IO相关逻辑,关于rsync的发送算法并 ...
- 【原】Java学习笔记020 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 成员方法的参数列表 ...
- Win10 - MySQL 10061 错误
Win10 - MySQL 10061 错误 报错内容为: Can't connect to MySQL server on localhost (10061) 参考 : MySQL问题记录--Can ...
- 复制命令(ROBOCOPY)
ROBOCOPY 命令: // 描述: 相比较 xcopy.copy 来说,复制的功能就强大很多, xcopy.copy 是单线程的,robocopy是多线程的,但是和一些专业的复制软件相比速度还是 ...