10

是否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)

server/__init__.py

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

app = Flask(__name__)

app.register_blueprint(pages)
app.register_blueprint(users)

server/pages/__init__.py

pages = Blueprint('pages', __name__)

@pages.route('/')
def index(): return '<h1>Index</h1>'

server/users/__init__.py

users = Blueprint('users', __name__)

@users.route('/login')
def login():
    ...
    return redirect(url_for('pages.index'))
                    ^^^^^^^^^^^^^^^^^^^^^^

url_for呼叫引发What BuildError: ('pages.index', {}, None) would be a way to get to ?'pages.index'

(我尝试导入模块,但没有奏效)

4

2 回答 2

6

简短的回答:是的

长(ish)答案:

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

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

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

在烧瓶中,您可以从拥有的蓝图中使用相对端点 ( .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>])
>>>
于 2013-11-29T01:07:21.900 回答
2

如果您正在使用url_value_preprocessor,请确保您设置正确,url_defaults否则url_for将没有足够的值来构建 url,并且您会收到这个非常令人困惑的错误消息。

例子。

@bp.url_value_preprocessor
def get_project(endpoint, values):
    project_name = values.pop('project_name')
    g.project = Project.query.filter_by(name=project_name).first_or_404()

@bp.url_defaults
def add_project(endpoint, values):
    if 'project_name' in values or not g.project:
        return
    values['project_name'] = g.project.name
于 2015-01-11T13:31:02.963 回答