zoukankan      html  css  js  c++  java
  • PythonWEB框架之Flask--2

    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 test(e):
        pass

    5 errorhandler

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

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

    6 template_global

    标签:将做修饰的函数编程一个标签,然后在前端页面上加括号执行

    @template_global()
    def test(a,b):
        return a+b
    
    #{{test(2,3)}}

    7 template_filter

    过滤器

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

    总结:

      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'

    使用蓝图之中小型系统

    详见代码:

    目录结构:

    
    
            

    _init.py

    from flask import Flask
    
    app = Flask(__name__)
    #3 把蓝图注册到app中
    from flask_test.views import order
    from flask_test.views import user
    app.register_blueprint(order.order_blue)
    app.register_blueprint(user.user_blue)

    manage.py

    from flask_test import app
    app.debug = True
    if __name__ == '__main__':
        app.run()

    user.py

    #1 创建蓝图
    from flask import Blueprint
    #2 使用蓝图
    user_blue = Blueprint('user',__name__,url_prefix='/app01')
    #加上url_prefix='/app01' 的时候,在地址输入时http://127.0.0.1:5000/app01/login
    # 或者http://127.0.0.1:5000/app01/logout
    
    @user_blue.route('/login')
    def login():
        return 'login 页面'
    
    @user_blue.route('/logout')
    def logout():
        return 'logout 页面'

    order.py

    #1 创建蓝图
    from flask import Blueprint
    #2 使用蓝图
    order_blue=Blueprint('order',__name__,url_prefix='/app02')
    #加上url_prefix='/app01' 的时候,在地址输入时http://127.0.0.1:5000/app02/order
    
    @order_blue.route('/order')
    def order():
        return 'order 页面'

    ps:使用蓝图是按照上述结构搭建项目,然后完成

    第一步:在视图文件中创建蓝图

    from flask import Blueprint

    第二步:在视图函数中使用蓝图

    order_blue=Blueprint('order',__name__,url_prefix='/app02',template_folder='tt')
    
    #url_prefix就是对视图函数进行分类,比如  http://127.0.0.1:5000/app01/login 
    http://127.0.0.1:5000/app01/logout
    http://127.0.0.1:5000/app02/order
    
    #template_folder就是在视图函数中创建一个'tt'作为模板的文件夹,里面放模板文件
    
    )
    #加上url_prefix='/app01' 的时候,在地址输入时http://127.0.0.1:5000/app02/order
    
    @order_blur.route('/order')
    def order():
        return 'order 页面'

    template_folder用法图示如下

    第三步:

    在__init__构造函数中把蓝图注册到app中
    from flask_test.views import order
    from flask_test.views import user
    app.register_blueprint(order.order_blue)
    app.register_blueprint(user.user_blue)

    使用蓝图之大型系统

    详见代码:

    目录结构:

    admin

      --__init__.py

    from flask import Blueprint
    
    admin = Blueprint(
        'admin',
        __name__,
        template_folder='templates',
        static_folder='static'
    )
    from . import views

    admin

      -views.py

    from . import admin
    
    @admin.route('/index')
    def index():
        return 'Admin.Index'

    web

      -__init__.py

      

    from flask import Blueprint
    
    web = Blueprint(
        'web',
        __name__,
        template_folder='templates',
        static_folder='static'
    )
    from . import views

    web

      -views.py

    from . import web
    
    @web.route('/index')
    def index():
        return 'Web.Index'

    pro_flask

      -__init__.py

    from flask import Flask
    from .admin import admin
    from .web import web
    
    app = Flask(__name__)
    app.debug = True
    
    app.register_blueprint(admin, url_prefix='/admin')
    app.register_blueprint(web)

    run.py

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

    ps:admin和web可以看成是一个个的app,每一个app都有自己一套的规范

    总结:

    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的概念

  • 相关阅读:
    算法88---图的遍历
    算法87-----DAG有向无环图的拓扑排序

    网络存储(一)之存储的概念和术语
    DNS(二)之bind的视图功能
    DNS(二)之构建域名解析缓存
    DNS(一)之禁用权威域名服务器递归解析
    通过rsync搭建一个远程备份系统(二)
    通过rsync搭建一个远程备份系统(一)
    Mysql和Memcached的连动
  • 原文地址:https://www.cnblogs.com/ouyang99-/p/10395852.html
Copyright © 2011-2022 走看看