在蓝图中使用url_for

aru*_*ngh 6 python flask

是否url_for可以跨蓝图工作?

/flaskapp
    /runserver.py           (from server import app; app.run(debug=True))
    /server
        /__init__.py        (app = Flask(__name__))
        /pages
            /__init__.py    ('pages' blueprint)
        /users
            /__init__.py    ('users' blueprint)
Run Code Online (Sandbox Code Playgroud)

server/__init__.py:

from server.pages import pages
from server.users import users

app = Flask(__name__)

app.register_blueprint(pages)
app.register_blueprint(users)
Run Code Online (Sandbox Code Playgroud)

server/pages/__init__.py:

pages = Blueprint('pages', __name__)

@pages.route('/')
def index(): return '<h1>Index</h1>'
Run Code Online (Sandbox Code Playgroud)

server/users/__init__.py:

users = Blueprint('users', __name__)

@users.route('/login')
def login():
    ...
    return redirect(url_for('pages.index'))
                    ^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

这个url_for电话提出了BuildError: ('pages.index', {}, None) 什么是一种方法'pages.index'

(我尝试导入模块,但这不起作用)

not*_*you 5

简答:是

长(ish)答案:

尽我所知,你正在按照你应该的方式组织你的应用程序。

我已经重新创建了您的设置(尽管在单个文件中),您可以在此处结帐。这段代码在我的机器上运行。

https://gist.github.com/enlore/80bf02346d6cabcba5b1

在 Flask 中,您可以.login从拥有的蓝图中使用相对端点 ( )访问给定的视图函数,或者在user.login任何地方通过绝对端点 ( )访问给定的视图函数。

我的钱是你在视图函数名称中打错了。

就像 Mark Hildreth 在评论中所说的那样,调试问题的一个好方法是查看您的 url 映射。

>>> from app import app
>>> app.url_map
Map([<Rule '/login' (HEAD, OPTIONS, GET) -> user.login>,
 <Rule '/' (HEAD, OPTIONS, GET) -> pages.index>,
 <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
>>>
Run Code Online (Sandbox Code Playgroud)