返回顶部

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

 

测试结果如下

 

posted @ 2018-09-03 23:49  Crazymagic  阅读(407)  评论(0编辑  收藏  举报