欢迎光临散文网 会员登陆 & 注册

利用Python Flask蓝图加自定义蓝图划分优雅的目录结构

2023-03-07 17:23 作者:IFELES  | 我要投稿

我们在用Flask开发网站的时候。经常看到有很多人把所有的路由函数放到了入口文件,这种做法是非常不可取的,如果我们的视图函数有几百个了都写到一个文件里肯定是不行的。还有在实现中我们都在比较大型项目里面我们可能有十几个甚至几十个这种不同模型。我们需要考虑把这些模型分文别类归属到不同的文件中去。而不是都集中在同一个文件中。如下图这种:


是不是很乱,那么我们怎么拆分这些函数了。接下来我们就来简单实现一下:


一、 规划目录结构


二、新建app包构造核心目录

api/v1/init.py 接口目录为版本号模块初始化文件
api/v1/user.py 接口目录为版本号加上模块名称文件
config/settings.py 包为配置文件
lib/redprint.py核心类文件模仿蓝图重写
app.py 核心入口文件
当然还有其他包比如model为数据库validate为验证等等就不在列举

  1. api/v1/init.py 用蓝图托管版本号导入不同模块

    from flask import Blueprint
    from app.api.v1 import user, website
    def create_blueprint_v1():
        bp_v1 = Blueprint('v1', __name__)
        user.api.register(bp_v1)
        website.api.register(bp_v1)
        return bp_v1
  2. api/v1/user.py 用lib下自定义redprint托管模块

    from app.lib.redprint import Redprint
    api = Redprint('user')
    
    @api.route('/get')
    def get_user():
        return 'get'
    
    @api.route('/create')
    def create_user():
        return 'create'
  3. settings.py 一些数据库等配置信息

    TOKEN_EXPIRATION = 30 * 24 * 3600
    SQLALCHEMY_DATABASE_URI = \
        'mysql+cymysql://root:123456@localhost/test'
    SECRET_KEY = 'test'
  4. redprint.py模仿蓝图重写register和route方法

    class Redprint(object):
        def __init__(self, name):
            self.name = name
            self.mound = []
    
        def route(self, rule, **options):
            def decorator(f):
                self.mound.append((f, rule, options))
                return f
    
            return decorator
    
        def register(self, bp, url_prefix=None):
            if url_prefix is None:
                url_prefix = '/' + self.name
            for f, rule, options in self.mound:
                endpoint = options.pop("endpoint", f.__name__)
                bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
  5. app.py 核心入口文件

    from flask import Flask
    
    
    def register_blueprints(app):
        from app.api.v1 import create_blueprint_v1
        app.register_blueprint(create_blueprint_v1(), url_prefix='/v1')
    
    
    def create_app():
        app = Flask(__name__)
        app.config.from_object('app.config.settings')
        register_blueprints(app)
        return app


三、main.py入口文件


from app.app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5001)

测试看一下效果:


利用Python Flask蓝图加自定义蓝图划分优雅的目录结构的评论 (共 条)

分享到微博请遵守国家法律