【问题标题】:Flask-SQLAlchemy pagination error: Could not build url for endpoint with values ['page']Flask-SQLAlchemy 分页错误:无法为具有值 ['page'] 的端点构建 url
【发布时间】:2021-07-23 18:32:36
【问题描述】:

在尝试使用 Flask-SQLAlchemy 使分页正常工作时,我对是什么导致了我遇到的错误感到困惑。 以下是相关页面的视图:

@main.route('/collections/<int:page>', defaults={"page": 1})
def all_collections(page):
    users = User.users_with_bottles().paginate(page=page, per_page=1, error_out=False)

    if users is None:
        return redirect(url_for('main.collection',
                                name=current_user.username))

    total_collections = Bottle.total_collections()

    return render_template('gallery.html',
                           users=users,
                           total_num=total_collections,
                           title='Browse Collections')

这是gallery.html 的一部分,似乎是导致问题的原因:

{% for page in users.iter_pages() %}
    {% if page %}
        # the below line seems to be the issue
        <a href="{{ url_for('main.all_collections', page=page) }}">{{ page }}</a>
    {% else %}
        ...
    {% endif %}
{% endfor %}

据我所知,有些页面应该可以用于链接,就像我一样:

{% if page %}
    {{ page }}
{% endif %}

它打印1 2 3。删除gallery.html 中的url_for 部分会导致http://127.0.0.1:5000/collections/1 正常加载。我不确定这个问题的原因,因为我有许多其他带有动态 URL 的 main. 视图可以正常工作,所以我不知道在这种情况下我做错了什么。

以下是此问题的回溯:

Traceback (most recent call last):
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\app\main\views.py", line 46, in all_collections
return render_template('gallery.html',
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\templating.py", line 137, in render_template
return _render(
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\templating.py", line 120, in _render
rv = template.render(context)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\jinja2\environment.py", line 1090, in render
self.environment.handle_exception()
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\jinja2\environment.py", line 832, in handle_exception
reraise(*rewrite_traceback_stack(source=source))
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\jinja2\_compat.py", line 28, in reraise
raise value.with_traceback(tb)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\app\templates\gallery.html", line 1, in top-level template code
{% extends 'base.html' %}
  File "C:\Users\Me\PycharmProjects\flask-sake-project\app\templates\base.html", line 6, in top-level template code
{% block content %}{% endblock %}
  File "C:\Users\Me\PycharmProjects\flask-sake-project\app\templates\gallery.html", line 39, in block "content"
<a href="{{ url_for('main.all_collections', page=page) }}">{{ page }}</a>
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\helpers.py", line 370, in url_for
return appctx.app.handle_url_build_error(error, endpoint, values)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\app.py", line 2216, in handle_url_build_error
reraise(exc_type, exc_value, tb)
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\flask\helpers.py", line 357, in url_for
rv = url_adapter.build(
  File "C:\Users\Me\PycharmProjects\flask-sake-project\venv\Lib\site-packages\werkzeug\routing.py", line 2179, in build
raise BuildError(endpoint, values, method, self)
werkzeug.routing.BuildError: Could not build url for endpoint 'main.all_collections' with values ['page'].

编辑:我还要注意,我对解决此错误的所有搜索都没有真正帮助,因此我问了这个问题。我只发现了另一篇 Stack Overflow 帖子,其中有人遇到了与我相同的问题,并且没有得到公认的答案(通常回复很少)。

【问题讨论】:

  • 如果您手动只在模板上添加一个{{ url_for('main.all_collections', page=2 }},您还会收到错误吗?
  • @Doobeh 我刚试过。不幸的是,我仍然遇到同样的错误。

标签: python flask routes pagination flask-sqlalchemy


【解决方案1】:

我认为你处理默认值的方式出了什么问题,你目前有:

@main.route('/collections/<int:page>', defaults={"page": 1})
    def all_collections(page):
        ...

然后你也传入了一个页面整数url_for('...', page=x),所以烧瓶最终会得到两个值,并且变得脾气暴躁。你想要做的是这样的:

@main.route('/collections/<int:page>')
@main.route('/collections/', defaults={'page': 1}  # if no page is asked for-- return page 1.
    def all_collections(page):
        ...

所以现在/collections/ 将使用默认值1,但如果您指定page,则会触发另一个路由选项,不会有任何混淆。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多