美文网首页
红图(Redprint)设计

红图(Redprint)设计

作者: royluck | 来源:发表于2021-06-25 14:23 被阅读0次
    项目结构:
    app - libs - redprint.py
    app - api - v1 - resident.py
    app - api - v1 - __init__.py
    app - __init__.py
    

    红图的实现核心模拟蓝图的:
    • route装饰器
    • 注册函数register

    区别在于,通过self.mound来储存对应参数,然后再到register中解包,这样便可以将对应参数传给bp,并调用add_url_rule方法

    class Redprint:
        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
                # 蓝图默认返回的endpoint名字格式是:self.name + f.__name__
                # f.__name__ 是视图函数view_func的名字
    
                # 但是为了能在scope权限控制哪里 可以通过传递模块的名字 以模块为单位 进行权限控制
                # 而不是单独以视图函数名字为单位
    
                # 改为红图 加 视图函数的形式 v1.red_name+view_func
                # v1.view_func  ===> v1.red_name+view_func
                endpoint = self.name + '+' + \
                           options.pop("endpoint", f.__name__)
                bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
    
    • 文件地址: app - api - v1 - resident.py
    from app.libs.redprint import Redprint
    api = Redprint('resident') # 视图层注册红图
    
    • 文件地址: app - api - v1 - init.py
    from flask import Blueprint
    from app.api.v1 import resident
    ...
    
    def create_blueprint_v1():
        bp_v1 = Blueprint('v1',__name__)
    
        resident.api.register(bp_v1)
        ...
        return bp_v1
    
    • 文件地址: app - init.py
    # 注册
    from .app 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.secure')
        app.config.from_object('app.config.settings')
    
        register_blueprints(app)
        return app
    

    相关文章

      网友评论

          本文标题:红图(Redprint)设计

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