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

发布时间 2023-08-08 16:36:11作者: mingruqi

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

 

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


一、 规划目录结构

 

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

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

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'

settings.py 一些数据库等配置信息

TOKEN_EXPIRATION = 30 * 24 * 3600
SQLALCHEMY_DATABASE_URI = \
    'mysql+cymysql://root:123456@localhost/test'
SECRET_KEY = 'test'

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)

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)

测试看一下效果:

 

 

————————————————
版权声明:本文为CSDN博主「馒头糕饼一齐要」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28744695/article/details/129386541