案例:可配置发送信息的系统

假如我们有这样的一个系统,可以发送短息,邮件和微信,后期可能还会增加一些平台,怎么才可以做到快速切换的去使用某种功能呢,在这里我会通过在配置文件中简单的配置就可以实现

在项目的根目录下创建  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)的更多相关文章

  1. Flask快速入门

    flask快速入门 1.1.三种框架比较 Django: 重武器,内部包含了非常多组件:ORM.Form.ModelForm.缓存.Session.中间件.信号等 Flask:短小精悍,内部没有太多组 ...

  2. 02 flask源码剖析之flask快速使用

    02 flask快速使用 目录 02 flask快速使用 1.flask与django的区别 2. 安装 3. 依赖wsgi Werkzeug 4. 快速使用flask 5. 用户登录&用户管 ...

  3. docker&flask快速构建服务接口(二)

    系列其他内容 docker快速创建轻量级的可移植的容器✓ docker&flask快速构建服务接口✓ docker&uwsgi高性能WSGI服务器生产部署必备 docker&g ...

  4. 【Flask】Flask快速玩框架

    最近比较忙 快速玩Flask框架,为微博做些准备 part 1 python程序 from flask importFlask, render_template, session, redirect, ...

  5. 【转】Flask快速入门

    迫不及待要开始了吗?本页提供了一个很好的 Flask 介绍,并假定你已经安装好了 Flask.如果没有,请跳转到 安装 章节. 一个最小的应用 一个最小的 Flask 应用看起来会是这样: from ...

  6. Flask快速入门,知识整理

    一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  7. 【先验知识归纳】Flask快速入门

    本文参考:快速入门 - Flask 0.10.1 文档 路由 Flask使用route修饰器来关联URL与程序函数: @app.route('/') def hello_world(): return ...

  8. Flask (四) 模型进阶

    模型进阶 多对多关联 用户收藏电影,一个用户可以收藏多部电影, 一部电影可以被不同的用户收藏, 是一个多对多关系. ​ # 中间表(不是模型) collects = db.Table('collect ...

  9. Flask官方文档学习-flask快速入门

    环境搭建 下载安装Python3:www.python.org 终端运行命令:python3 -m venv flask_dev,来创建虚拟环境 启用虚拟环境,终端使用命令 source /flask ...

随机推荐

  1. C#基础-九九乘法表和冒泡排序

    //乘法表 ; i < ; i++)//行 { ; j < ; j++)//列 { if (j <= i) { Console.Write("{0}*{1}={2}\t&q ...

  2. aps.net core mvc中使用session

    原因>>用session是想验证 前端输入的验证码和后端存入seesion的是否一致,也可以使用的是TempData[]. 铺垫>> 前端用GetValidateCode()方 ...

  3. [android] 相对布局和单位简介

    /**********************2016年4月23日 更新*******************************/ 知乎:为何Android的默认布局是RelativeLayou ...

  4. Apollo配置中心源码分析

    Apollo配置中心源码分析 1. apollo的核心代码分享 SpringApplication启动的关键步骤 在SpringApplication中,会加载所有实现了Init方法的类 protec ...

  5. Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

    学习Solr前需要有Lucene的基础 Lucene的一些简单用法:https://www.cnblogs.com/dddyyy/p/9842760.html 1.部署Solr到Tomcat(Wind ...

  6. ARM与FPGA通过spi通信设计1.spi基础知识

    SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息.SPI总线可直接与各个厂家生产 ...

  7. SpreadJS使用进阶指南 - 使用 NPM 管理你的项目

    前言 SpreadJS作为一款性能出众的纯前端电子表格控件,自2015年发布以来,已经被广泛应用于各领域“在线Excel”数据管理项目中.NPM,作为管理Node.js库最有力的手段,解决了很多Nod ...

  8. 使用GRPC远程服务调用

    远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程.如 ...

  9. 在Windows 10上利用seafile搭建个人云服务

    参考seafile官方文档 安装Python 2.7.11 32位版 下载地址:https://www.python.org/downloads/release/python-2711/ 选择 32位 ...

  10. SSH鞋贸商城的设计与实现

    目录 应用技术 需求分析 总体设计 项目UI展示 一.应用技术 ①SSH SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架.区别于 S ...