zoukankan      html  css  js  c++  java
  • flask08--蓝图,多app使用

    1.1 蓝图的基本使用

    在我的flask中,我们可以利用蓝图对程序目录的划分。

    思考如果我们有很多个视图函数,比如下面这样我们是不是应该抽取出来专门的py文件进行管理呢?

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/login/')
    def login():
        return "login"
    
    @app.route('/logout/')
    def logout():
        return "logout"
    
    @app.route('/add_order/')
    def add_order():
        return "add_order"
    
    @app.route('modify_order')
    def modify_order():
        return "modify_order"
    
    
    if __name__ == '__main__':
        app.run()
    

    上面的这种是不是会显得主运行文件特别乱,这个时候我们的蓝图就闪亮登场了。

    1.1.1实例:

    项目目录:

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

    views/user.py

    from flask import Blueprint
    
    # 1 创建蓝图
    user_bp = Blueprint('user',__name__)
    
    # 2 利用蓝图创建路由关系
    @user_bp.route('/login/')
    def login():
        return "login"
    
    @user_bp.route('/logout/')
    def logout():
        return "logout"
    

    views/order.py

    from flask import Blueprint
    
    order_bp = Blueprint('order',__name__)
    
    @order_bp.route('/add_order/')
    def add_order():
        return "add_order"
    
    @order_bp.route('/modify_order/')
    def modify_order():
        return "modify_order"
    

    app.py

    from flask import Flask
    from views.user import user_bp
    from views.order import order_bp
    
    app = Flask(__name__)
    # 3 注册蓝图
    app.register_blueprint(user_bp)
    app.register_blueprint(order_bp)
    
    
    if __name__ == '__main__':
        app.run()
    

    访问:

    1552424766233

    其他的几条路由也是直接访问,在此就不做展示了。

    讲解:

    观察views/user.py

    • 我们可以把所有的视图函数抽出来多个文件。

    • 在这里我们通过user_bp = Blueprint('user',__name__)创建一个蓝图对象

      参数讲解:

      • user_bp :是用于指向创建出的蓝图对象,可以自由命名。
      • Blueprint的第一个参数自定义命名的‘user’用于url_for翻转url时使用。
      • __name__用于寻找蓝图自定义的模板和静态文件使用。
    • 蓝图对象的用法和之前实例化出来的app对象用法很像,可以进行注册路由。

    观察app.py

    • 这里我们需要手动的去注册一下蓝图,才会建立上url和视图函数的映射关系。

    关键词:

    1. 创建蓝图

      user_bp = Blueprint('user',__name__)

    2. 利用蓝图创建路由关系

      @bp.route('/login/') def login(): return "login"

    3. 注册蓝图 app.register_blueprint(bp)

    3.2 蓝图的高级使用(重点备课内容)

    3.2.1 蓝图中实现path部分的url前缀

    创建蓝图的时候填写url_prefix可以为增加url的path部分的前缀,可以更方便的去管理访问视图函数。

    from flask import Blueprint
    
    # 1 创建蓝图
    user_bp = Blueprint('user',__name__,url_prefix='/user')
    # 注意斜杠跟视图函数的url连起来时候不要重复了。
    

    1552425130691

    注意:

    1. 斜杠跟视图函数的url连起来时候不要重复了。

      图解:

      1552426158515

    2.url加前缀的时候也可以再注册蓝图的时候加上,更推荐这么做,因为代码的可读性更强。

    Copyapp.register_blueprint(user_bp,url_prefix='/order')
    

    3.3.2 蓝图中自定义模板路径

    创建蓝图的时候填写template_folder可以指定自定义模板路径

    # 1 创建蓝图                                           #所对应的参数路径是相对于蓝图文件的
    user_bp = Blueprint('user',__name__,url_prefix='/user',template_folder='views_templates')
    

    注意

    1. 蓝图虽然指定了自定义的模板查找路径,但是查找顺序还是会先找主app规定的模板路径(templates),找不到再找蓝图自定义的模板路径。

    2. Blueprinttemplate_folder参数指定的自定义模板路径是相对于蓝图文件的路径。

      图解:

      (01)

      1552425776786

      (02)

      1552425616132

    3.3.3 蓝图中自定义静态文件路径

    创建蓝图的时候填写static_folder可以指定自定义静态文件的路径

    user_bp = Blueprint('user',__name__,url_prefix='/user',template_folder='views_templates',
                        static_folder='views_static')
    

    注意:

    1. 在模板中使用自定义的静态文件路径需要依赖url_for()
    2. 下节讲解如何在模板中应用蓝图自定义的静态文件。

    3.3.4 url_for()翻转蓝图

    视图中翻转url:

    url_for('创建蓝图时第一个参数.蓝图下的函数名')
    # 如:
    url_for('user.login')
    

    模板中翻转url:

    {{ url_for('创建蓝图时第一个参数.蓝图下的函数名') }}
    # 如:
    {{ url_for('user.login') }}
    

    模板中应用蓝图自定义路径的静态文件:

    {{ url_for('创建蓝图时第一个参数.static',filename='蓝图自定义静态文件路径下的文件') }}
    # 如:
    {{ url_for('user.static',filename='login.css') }}
    

    3.3.5 蓝图子域名的实现

    创建蓝图的时候填写subdomain可以指定子域名,可以参考之前注册路由中实现子域名。

    (1) 配置C:WindowsSystem32driversetchosts

    127.0.0.1 bookmanage.com
    127.0.0.1 admin.bookmanage.com
    

    (2)给app增加配置

    app.config['SERVER_NAME'] = 'bookmanage.com:5000'
    

    (3)创建蓝图的时候添加子域名 subdomain='admin'

    # 1 创建蓝图                                           
    user_bp = Blueprint('user',__name__,url_prefix='/user',template_folder='views_templates',
                        static_folder='views_static',subdomain='admin')
    
    
    # 2 利用蓝图创建路由关系
    @user_bp.route('/login/')
    def login():
        return render_template('login_master.html')
    

    (4) 访问admin.bookmanage.com:5000/user/login/

    1552428071447

    3.3.6 蓝图中使用自己请求扩展

    在蓝图中我们可以利用创建好的蓝图对象,设置访问蓝图的视图函数的时候触发蓝图独有的请求扩展。

    例如:

    order_bp = Blueprint('order',__name__)
    
    
    @order_bp.route('/add_order/')
    def add_order():
        return "add_order"
    
    @order_bp.before_request
    def order_bp_before_request():
        return '请登录'
    

    注意:

    • 只有访问该蓝图下的视图函数时候才会触发该蓝图的请求扩展。
    • 可以这么理解:相当app的请求扩展是全局的,而蓝图的请求扩展是局部的只对本蓝图下的视图函数有效。

    3.3 使用蓝图之中小型系统

    目录结构:

    -flask_small_pro
    	-app01
        	-__init__.py
        	-static
            -templates
            -views
            	-order.py
                -user.py
         -manage.py 
            
    __init__.py
    from flask import Flask
    from app01.views.user import user_bp
    from app01.views.order import order_bp
    
    
    app = Flask(__name__)
    
    app.register_blueprint(user_bp,url_prefix='/user')
    app.register_blueprint(order_bp)
    

    user.py

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

    order.py

    from flask import Blueprint
    
    order_bp = Blueprint('order',__name__)
    
    @order_bp.route('/add_order/')
    def add_order():
        return 'buy_order'
    
    
    @order_bp.route('/modify_order/')
    def modify_order():
        return 'modify_order'
    

    manage.py

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

    3.4 使用蓝图之使用大型系统

    这里所谓的大型系统并不是绝对的大型系统,而是相对规整的大型系统,相当于提供了一个参考,在真实的生成环境中会根据公司的项目以及需求,规划自己的目录结构。

    文件路径:

    │  run.py  
    │
    │
    └─pro_flask  # 文件夹
        │  __init__.py 
        │
        ├─admin	 # 文件夹
        │  │  views.py
        │  │  __init__.py
        │  │
        │  ├─static # 文件夹
        │  └─templates  # 文件夹
        │
        └─web	# 文件夹
           │  views.py
           │  __init__.py
           │
           ├─static  # 文件夹
           └─templates # 文件夹
        
        
    

    run.py 启动app

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

    __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)
    

    admin.views.py 完成注册路由以及视图函数

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

    admin.__init__.py 生成蓝图对象导入views,使得views的代码运行完成注册路由

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

    web文件夹下和admin文件夹下目录构成完全一致,这里就不举例子了

    2. 多app的使用(有了蓝图基本不用这个)

    from werkzeug.wsgi import DispatcherMiddleware
    from werkzeug.serving import run_simple
    from flask import Flask, current_app
    app1 = Flask('app01')
    app2 = Flask('app02')
    
    @app1.route('/index')
    def index():
        return "app01"
    
    @app2.route('/index2')
    def index2():
        return "app2"
    
    # http://www.oldboyedu.com/index
    # http://www.oldboyedu.com/sec/index2
    dm = DispatcherMiddleware(app1, {
        '/sec': app2,
    })
    
    if __name__ == "__main__":
        run_simple('localhost', 5000, dm)
    
    永远不要高估自己
  • 相关阅读:
    mysql 统计新增每天数据
    Oracle dg下掉一个从库
    rman全备脚本
    Linux Shell 统计一(行列)数值的总和及行、列转换
    pt工具加字段脚本
    MySQL慢日志切割邮件发送脚本
    MySQL主从复制邮件报警脚本
    读书清单
    数据库学习笔记
    JAVAEE学习笔记
  • 原文地址:https://www.cnblogs.com/liqiangwei/p/14408824.html
Copyright © 2011-2022 走看看