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

Flask新手提问:如何为工厂模式应用从其他模块添加视图?

Flask工厂模式下添加视图的最简方法

嘿,我完全懂你的感受——刚接触Flask工厂模式时,想把视图拆分到不同文件确实容易卡壳,尤其是觉得蓝图有点复杂的时候。先直接说:你尝试的那种from views import goodbye的方式行不通,因为views.py里的@app.route引用的app根本没定义——工厂模式里的app是在create_app函数内部动态创建的,其他文件没法直接拿到这个实例。

下面给你两种简单的解决方案,从最简的无蓝图方式开始:

方案1:不用蓝图,通过注册函数绑定视图

这是小项目里最直接的方式,不需要引入蓝图的概念:

1. 修改views.py,写一个接收app的注册函数

把视图路由的注册逻辑包装成一个函数,让它接收创建好的app实例:

# views.py
def register_routes(app):
    @app.route('/goodbye')
    def goodbye():
        return 'Goodbye, World!'
    
    # 可以在这里加更多视图,比如
    @app.route('/hello-again')
    def hello_again():
        return 'Hello again!'

2. 在create_app里调用注册函数

回到你的工厂函数里,导入views并调用这个注册函数,把刚创建的app传进去:

# __init__.py
import os
from flask import Flask

def create_app(test_config=None):
    # 创建并配置应用(原代码不变)
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )
    if test_config is None:
        app.config.from_pyfile('config.py', silent=True)
    else:
        app.config.from_mapping(test_config)
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # 注册外部视图
    from . import views
    views.register_routes(app)

    # 原有的hello视图
    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    return app

这样运行后,/goodbye和/hello-again就能正常访问了,完全不用碰蓝图。

方案2:最简版蓝图用法(适合未来扩展)

如果之后你的项目变大,拆分多个模块的话,蓝图还是更清晰的。其实用最简版的蓝图也没那么复杂:

1. 在views.py中创建蓝图

# views.py
from flask import Blueprint

# 创建一个名为'main'的蓝图,参数__name__是当前模块名
bp = Blueprint('main', __name__)

@bp.route('/goodbye')
def goodbye():
    return 'Goodbye, World!'

2. 在create_app里注册蓝图

只需要在工厂函数里添加一行注册代码:

# __init__.py
# ... 原有的配置代码 ...

def create_app(test_config=None):
    app = Flask(__name__, instance_relative_config=True)
    # ... 原有的配置代码 ...

    # 注册蓝图
    from . import views
    app.register_blueprint(views.bp)

    # 原有的hello视图
    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    return app

这种方式的好处是,之后如果要加更多视图文件(比如auth.py处理登录注册),只需要创建新的蓝图并注册就行,不会把所有路由挤在一个文件里,扩展性更好。

总结一下:小项目用方案1最省事,不用额外学习蓝图;如果之后项目要扩展,方案2的最简蓝图用法也足够简单,不会有太多复杂的配置。

内容的提问来源于stack exchange,提问作者David J.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:07:36