通过另一个模块中的蓝图路由视图不起作用

问题描述 投票:0回答:1

我有一个包含以下三个文件的烧瓶项目:

# app.py

from flask import Flask

from userbp import bp

app =  Flask(__name__)
app.register_blueprint(bp)

@app.route("/")
def index():
    return "Hello, world"
# userbp.py
from flask import Blueprint


bp = Blueprint("user", __name__, url_prefix="/user")
# user_views.py

from userbp import bp


@bp.route("/<string:name>")
def greet(name):
    return f"Hello, {name}! How are you?"

这是该项目根目录的结构:

.
├── __pycache__
│   ├── app.cpython-311.pyc
│   └── userbp.cpython-311.pyc
├── app.py
├── user_views.py
└── userbp.py

它没有按预期工作,点击 URL

/John
会出现 494 未找到错误。如果我将
greet
视图从
user_views.py
移动到
userbp.py
,它会按预期工作。 为什么会这样呢? 如何解决这个问题?

谢谢。

python python-3.x flask
1个回答
0
投票

这个问题有 2 个解决方案。

  • 烧瓶中蓝图的最佳实践是
    sub-route
    应定义与
    blueprint
    启动相同。

所以你的代码应该是这样的

# app.py
from flask import Flask

# import blueprint from userbp.py
from userbp import bp

app = Flask(__name__)

app.register_blueprint(bp)


@app.route("/")
def index():
    return "Hello, world"


if __name__ == "__main__":
    app.run()

# userbp.py

from flask import Blueprint

# initialization of blueprint
bp = Blueprint("user", __name__, url_prefix="/user")

## implementation of sub-route blueprints
@bp.route("/<string:name>")
def greet(name):
    return f"Hello, {name}! How are you?"
  • 如果你还想将蓝图的初始化和子路由的实现分开,可以这样做。
# app.py

from flask import Flask

# import blueprint from user_views.py
from user_views import bp

app = Flask(__name__)

app.register_blueprint(bp)


@app.route("/")
def index():
    return "Hello, world"


if __name__ == "__main__":
    app.run()
# userbp.py

from flask import Blueprint


bp = Blueprint("user", __name__, url_prefix="/user")
# user_views.py

from userbp import bp


@bp.route("/<string:name>")
def greet(name):
    return f"Hello, {name}! How are you?"

这样就可以了。

问题是,为什么显示错误未找到导致您访问错误的路线。

应该是这样的http://localhost:5000/user/john。 因为在蓝图中你的代码被定义为子路由

user

在这里

bp = Blueprint("user", __name__, url_prefix="/user")
© www.soinside.com 2019 - 2024. All rights reserved.