You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask如何拆分路由模块?将路由移至独立文件的实现

Flask路由解耦的可行实现方案

方案1:用Flask蓝图(Blueprint)解耦(官方推荐)

蓝图是Flask官方提供的路由模块化方案,完美适配解耦需求,无需自定义Router类。

步骤1:拆分路由到独立文件

新建路由目录routes,创建单独的路由文件:

# routes/home_routes.py
from flask import Blueprint

# 创建蓝图实例
home_bp = Blueprint('home', __name__)

@home_bp.route('/home')
def home():
    return "Home Page"
# routes/oauth_routes.py
from flask import Blueprint, request

oauth_bp = Blueprint('oauth', __name__)

@oauth_bp.route('/oauth/authorize', methods=['GET', 'POST'])
def authorize():
    if request.method == 'GET':
        return "OAuth Authorize Page"
    # 处理POST请求逻辑
    return "OAuth Authorization Completed"

步骤2:在Server类中注册蓝图

# server.py
from flask import Flask
from routes.home_routes import home_bp
from routes.oauth_routes import oauth_bp

class Server:
    def create_server(self):
        app = Flask(__name__)
        # 注册所有蓝图
        app.register_blueprint(home_bp)
        app.register_blueprint(oauth_bp)
        return app

if __name__ == '__main__':
    server = Server()
    app = server.create_server()
    app.run(debug=True)

方案2:自定义Router类注入Flask实例

如果坚持要用自定义Router类,核心是将Flask的app实例传递给Router,确保路由装饰器能正确引用到app。

实现Router类

# routers/main_router.py
class MainRouter:
    def __init__(self, app):
        self.app = app
        # 初始化时自动注册路由
        self._register_routes()

    def _register_routes(self):
        @self.app.route('/home')
        def home():
            return "Home Page"

        @self.app.route('/oauth/authorize', methods=['GET', 'POST'])
        def authorize():
            return "OAuth Authorization Handler"

在Server类中初始化Router

# server.py
from flask import Flask
from routers.main_router import MainRouter

class Server:
    def create_server(self):
        app = Flask(__name__)
        # 传入app实例初始化Router
        MainRouter(app)
        return app

if __name__ == '__main__':
    server = Server()
    app = server.create_server()
    app.run(debug=True)

方案3:延迟路由注册(收集式注册)

通过自定义装饰器先收集路由函数,等Flask实例创建完成后再统一注册,适合更灵活的场景。

实现路由收集器

# routers/route_collector.py
# 存储收集到的路由:(路径, 请求方法, 视图函数)
collected_routes = []

def route(path, methods=None):
    if methods is None:
        methods = ['GET']
    def decorator(view_func):
        collected_routes.append((path, methods, view_func))
        return view_func
    return decorator

编写路由处理函数

# routes/handlers.py
from routers.route_collector import route

@route('/home')
def home():
    return "Home Page"

@route('/oauth/authorize', methods=['GET', 'POST'])
def authorize():
    return "OAuth Authorization Handler"

在Server类中注册所有路由

# server.py
from flask import Flask
from routers.route_collector import collected_routes
# 导入路由文件以触发收集
import routes.handlers

class Server:
    def create_server(self):
        app = Flask(__name__)
        # 批量注册收集到的路由
        for path, methods, view_func in collected_routes:
            app.add_url_rule(path, view_func=view_func, methods=methods)
        return app

if __name__ == '__main__':
    server = Server()
    app = server.create_server()
    app.run(debug=True)

错误原因说明

你之前遇到的NameError: name 'app' is not defined,本质是Router类中没有正确获取到Flask的app实例:要么是在app创建前就定义了路由,要么是没有将app实例传递给Router,导致装饰器找不到app对象。

内容的提问来源于stack exchange,提问作者volkavo nosky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:16:03