当前位置: 首页 > 知识库问答 >
问题:

flask - 请教Flask使用url_for创建分页链接的问题?

濮阳繁
2024-03-22

flasky学习过程中,有关分页的那部分使用url_for生成url的问题

假设查看的用户是haha

1.在用户头像创建的url

<a href="{{ url_for('.user', username = follow.user.username) }}">

生成的url是 http://xxx/user/haha

2.在下边分页创建导航栏的url

# 路由@main.route('/followed_by/<username>')def followed_by(username):    user = User.query.filter_by(username=username).first()    if user is None:        flash('Invalid user.')        return redirect(url_for('.index'))    page = request.args.get('page', 1, type=int)    pagination = user.followed.paginate(        page=page, per_page=current_app.config['FLASKY_FOLLOWERS_PER_PAGE'],        error_out=False)    follows = [{'user': item.followed, 'timestamp': item.timestamp}               for item in pagination.items]    return render_template('followers.html', user=user, title="Followed by",                           endpoint='.followed_by', pagination=pagination,                           follows=follows)

定义的宏

{% macro pagination_widget(pagination, endpoint) %}... <a href="{{ url_for(endpoint, page = p, **kwargs) }}">{{ p }}</a>

模板调用宏

    {{ macros.pagination_widget(pagination, endpoint, username = user.username) }}

为什么生成的url是 http://xxx/followers_by/haha?page=1
而不是是http://xxx/followers_by/?page=1&username=haha

希望老师讲解。

共有2个答案

章昆琦
2024-03-22

发现了原因
@main.route('/followed_by/<username>')
应为url_for提交的路由要求匹配<username>
当使用url_for(endpoint, page = p, username='haha')的时候
路由会自动匹配username='haha',所以生成的url变成了/followed_by/haha?page=1
路由会自动把匹配的参数提到?前边

强硕
2024-03-22

当你使用 Flask 的 url_for 函数生成 URL 时,它会基于你提供的端点(endpoint)和参数来构造 URL。在你的例子中,端点是 .followed_by,这个端点对应于你的路由 @main.route('/followed_by/<username>')

当你在模板中使用 url_for 生成分页链接时,你传递了 endpointpage 参数。然而,你没有传递 username 参数,这是导致 URL 不正确的原因。

为了解决这个问题,你需要在 pagination_widget 宏中传递 username 参数,并确保在 url_for 调用中正确地使用它。你可以通过在宏中接收 kwargs(关键字参数)来实现这一点,并在模板中调用宏时传递所有需要的参数。

下面是修改后的模板和宏代码示例:

<!-- 模板中调用 pagination_widget 宏 -->{% macro pagination_widget(pagination, endpoint, **kwargs) %}  ...  <a href="{{ url_for(endpoint, page=p, **kwargs) }}">{{ p }}</a>  ...{% endmacro %}<!-- 在模板中使用 pagination_widget 宏 -->{{ pagination_widget(pagination, '.followed_by', username=user.username) }}

在这个修改后的代码中,pagination_widget 宏现在接收一个额外的 **kwargs 参数,用于传递其他关键字参数(如 username)。在模板中调用 pagination_widget 时,你需要传递 username=user.username 作为关键字参数。这样,url_for 函数将能够正确地构造包含 username 的 URL。

现在,生成的 URL 应该类似于 http://xxx/followed_by/haha?page=1,其中 haha 是用户名。这样,你的分页链接就会正确地包含用户名参数。

 类似资料:
  • 问题内容: 如何在Flask中使用引用文件夹中的文件?例如,我的文件夹中有一些静态文件,其中一些可能位于子文件夹中。 当我尝试从提供文件时static/bootstrap,出现错误。 我可以使用此功能来引用不在子文件夹中的文件。 引用静态文件的正确方法是什么url_for?如何使用url_for任何级别的静态文件生成URL? 问题答案: 默认情况下,你具有静态文件的端点。还应用有以下参数: :可用

  • 问题内容: 我的Flask路线中有一半需要使用变量或。如何创建到这些位置的链接? 需要一个参数传递给函数,但是我不能添加参数? 问题答案: 它使用关键字参数作为变量:

  • 问题内容: 如何在Flask中使用引用文件夹中的文件?例如,我的文件夹中有一些静态文件,其中一些可能位于子文件夹中。 当我尝试从提供文件时,出现错误。 我可以使用此功能来引用不在子文件夹中的文件。 引用静态文件的正确方法是什么?如何使用任何级别的静态文件生成URL? 问题答案: 默认情况下,你具有静态文件的端点。还应用有以下参数: :可用于为网络上的静态文件指定其他路径。默认为文件夹的名称。 :包

  • 问题内容: 我想知道用于在模板和应用程序代码中生成链接的原因。 通过这样做,我可以获得什么: 和这个: 而不是硬编码路径? 问题答案: 从Flask的文档中, 使用提供的方法生成指向给定端点的URL。 目标端点未知的变量参数将作为查询参数附加到生成的URL。如果查询参数的值是,则将跳过整个对。如果蓝图处于活动状态,则可以通过在本地端点前面加点()来快捷引用同一蓝图。 现在,您无需使用静态网址即可到

  • 问题内容: 当我调用它时,它会生成,但是有时我希望它生成。我在文档中找不到要指定的位置。我需要做吗? 问题答案: 采用关键字参数,该参数将返回绝对(而非相对)URL。我相信您将需要在根域中设置一个配置密钥,以使其正常工作。

  • 问题内容: 使用jinja2 url_for()功能时出现问题。 我有一条这样的路线: 在jinja模板文件中,我想创建一个链接到article_page的URL,所以我这样写: 但是当我运行此页面时,出现错误: 似乎缺少第二个参数。如何正确使用多个参数? 问题答案: 根据文件: 如果查询参数的值为“无”,则将跳过整个对。 确保不是。 或在函数中指定默认值。