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 ...
随机推荐
- [转]在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查
本文转自:https://www.cnblogs.com/kongxianghai/p/5582661.html Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用Ja ...
- 从零开始学安全(三十六)●利用python 爆破form表单
import sys import requests from requests.auth import HTTPBasicAuth def Brute_Force_Web(postData): re ...
- JAVA Swing 改变标题栏左上角默认咖啡图标
前言 最近使用Java的swing开发了一个小程序,想要实现改变标题栏左上角的图标,找了网上的资料,经过了一个下午的尝试,都是未能成功,最后,终于是在Java的一本书上找到了结果 我只能说,网上的东西 ...
- 【学习笔记】tensorflow基础
目录 认识Tensorflow Tensorflow特点 下载以及安装 Tensorflow初体验 Tensorflow进阶 图 op 会话 Feed操作 张量 变量 可视化学习Tensorboard ...
- CSS Grid 布局完全指南(图解 Grid 详细教程)
CSS Grid 布局是 CSS 中最强大的布局系统.与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行.通过将 CSS 规则应用于 父元 ...
- vuex2中使用mapGetters/mapActions报错解决方法
解决方案 可以安装整个stage2的预置器或者安装 Object Rest Operator 的babel插件 babel-plugin-transform-object-rest-spread . ...
- js获取地址栏传参
地址:http://127.0.0.1:8082/prosperleedir/index.html?id=6666&name=prosper#prosper Location{ ...
- CentOS6.9升级autoconf版本,解决”Autoconf version 2.64 or higher is required“错误
安装软件时提示说需要Autoconf 2.64或更高的版本: # autoconf configure.ac:: error: Autoconf version 2.64 or higher is r ...
- Android Studio撤销与SVN的关联
为何会记录这一个问题,主要是在做项目的过程中出现了一个奇怪的现象,就是直接在文件目录下使用svn上传文件的话,可以看到该目录是与SVN相关联的,可是到了用Android Studio上传代码的时候却发 ...
- linux(centos7) 常用命令和快捷键 持续验证更新中...
1.文件和目录cd 进入目录示例:cd /home 进入home目录 cd.. 返回上一级目录cd../.. 返回上两级目录cd - 返回上次所在目录cd ~ 返回根目录 ...