美文网首页
闪现, 请求扩展, 蓝图, 中间件(了解)

闪现, 请求扩展, 蓝图, 中间件(了解)

作者: 火鸡不肥 | 来源:发表于2019-03-07 18:38 被阅读0次

    目录

    1. 闪现
    2. 请求扩展
    3. 中间件(了解)
    4. 蓝图

    9.闪现(message)

    -设置:flash('aaa')
    -取值:get_flashed_message()
    -假设在a页面操作出错,跳转到b页面,在b页面显示a页面的错误信息
    

    示例:

    
    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"
        # return redirect('/error')
    
    
    @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()
    

    10.请求扩展

    1 before_request

    类比django中间件中的process_request,在请求收到之前绑定一个函数做一些事情

    #基于它做用户登录认证
    @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')
    

    2 after_request

    类比django中间件中的process_response,每一个请求之后绑定一个函数,如果请求没有异常

    @app.after_request
    def process_response1(response):
        print('process_response1 走了')
        return response
    

    3 before_first_request

    第一次请求时,跟浏览器无关

    @app.before_first_request
    def first():
        pass
    

    4 teardown_request

    每一个请求之后绑定一个函数,即使遇到了异常

    @app.teardown_request 
    def ter(e):
        pass
    

    5 errorhandler

    路径不存在时404,服务器内部错误500

    @app.errorhandler(404)
    def error_404(arg):
        return "404错误了"
    

    6 template_global

    标签

    @app.template_global()
    def sb(a1, a2):
        return a1 + a2
    #{{sb(1,2)}}
    

    7 template_filter

    过滤器

    @app.template_filter()
    def db(a1, a2, a3):
        return a1 + a2 + a3
    #{{ 1|db(2,3)}}
    

    总结:
    1 重点掌握before_request和after_request,
    2 注意有多个的情况,执行顺序
    3 before_request请求拦截后(也就是有return值),response所有都执行

    11 中间件(了解)

    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__':
        #把原来的wsgi_app替换为自定义的
        app.wsgi_app = Md(app.wsgi_app)
        app.run()
    

    12.蓝图

    对程序进行目录结构划分

    不使用蓝图,自己分文件

    目录结构:

    -templates
    -views
        -__init__.py
        -user.py
        -order.py
    -app.py
    

    app.py

    from views import app
    if __name__ == '__main__':
        app.run()
    

    init.py

    from flask import Flask,request
    app = Flask(__name__)
    #不导入这个不行
    from . import account
    from . import order
    from . import user
    

    user.py

    from . import app
    @app.route('/user')
    def user():
        return 'user'
    

    order.py

    from . import app
    @app.route('/order')
    def order():
        return 'order'
    

    使用蓝图之中小型系统

    详见代码:pro_flask_简单应用程序目录示例.zip
    目录结构:

    -flask_pro
        -flask_test
            -__init__.py
            -static
            -templates
            -views
                -order.py
                -user.py
         -manage.py 
    

    _init.py

    from flask import  Flask
    app=Flask(__name__)
    from flask_test.views import user
    from flask_test.views import order
    app.register_blueprint(user.us)
    app.register_blueprint(order.ord)
    

    manage.py

    from flask_test import  app
    if __name__ == '__main__':
        app.run(port=8008)
    

    user.py

    from flask import Blueprint
    us=Blueprint('user',__name__)
    
    @us.route('/login')
    def login():
        return 'login'
    

    order.py

    from flask import Blueprint
    ord=Blueprint('order',__name__)
    
    @ord.route('/test')
    def test():
        return 'order test'
    

    使用蓝图之大型系统

    详见代码:pro_flask_大型应用目录示例.zip
    总结:
    1 xxx = Blueprint('account', name,url_prefix='/xxx') :蓝图URL前缀,表示url的前缀,在该蓝图下所有url都加前缀
    2 xxx = Blueprint('account', name,url_prefix='/xxx',template_folder='tpls'):给当前蓝图单独使用templates,向上查找,当前找不到,会找总templates
    3 蓝图的befort_request,对当前蓝图有效
    4 大型项目,可以模拟出类似于django中app的概念

    相关文章

      网友评论

          本文标题:闪现, 请求扩展, 蓝图, 中间件(了解)

          本文链接:https://www.haomeiwen.com/subject/twyhpqtx.html