zoukankan      html  css  js  c++  java
  • 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
    

     

    测试结果如下

  • 相关阅读:
    我国教育技术期刊主要栏目的内容分析
    是互动还是告状 “家校通”通往何处?(转)
    美国高中的班级管理制度
    什么是决策支持系统?
    2009 AECT International Convention
    AECT94定义和AECT2005定义
    感受美国小学生的幸福校园生活! (转)
    教育管理信息系统的研究
    教学评价的新发展
    抽象方法与虚方法(转)
  • 原文地址:https://www.cnblogs.com/crazymagic/p/9581943.html
Copyright © 2011-2022 走看看