You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Flask实现无限滚动?(HTMX或其他方法)

Flask + HTMX 实现无限滚动及测试路由修复

先解决你的测试路由故障

你的测试代码存在几个核心问题,导致无法正常运行,以下是修正方案:

1. 修正Python路由代码

from flask import Flask, request, render_template

app = Flask(__name__)

DATA = [{"name":"Neil"},{"name":"Corie"}]

def get_data(page=0, pagesize=1):
    start = pagesize * page
    end = start + pagesize
    # 处理超出数据范围的情况,避免索引错误
    return DATA[start:end] if start < len(DATA) else []

@app.route('/test', methods=['GET'])
def test():
    page = request.args.get("page", 0, type=int)
    data = get_data(page=page)
    # 判断是否还有下一页数据
    next_page = page + 1 if len(data) > 0 else None
    return render_template("test.html", data=data, next_page=next_page)

2. 修正test.html模板

{% for item in data %}
<tr>
    <td>{{ item.name }}</td>
    <td>{{ item.name.lower() }}@example.com</td>
    <td>随机ID</td>
</tr>
{% endfor %}

{% if next_page %}
<tr hx-get="/test/?page={{ next_page }}"
    hx-trigger="revealed"
    hx-swap="afterend"
    hx-target="this">
    <td colspan="3">加载中...</td>
</tr>
{% endif %}

说明:

  • 用hx-target="this"让新加载的内容替换当前触发器行,避免重复生成触发元素
  • 无更多数据时不再渲染触发器,终止后续请求

结合现有帖子代码实现无限滚动

基于你原有的帖子渲染逻辑,调整如下:

1. 修改Flask路由,支持分页获取帖子

def get_feed_posts(username, page=0, pagesize=10):
    # 原函数改为支持分页查询(示例基于数据库查询逻辑)
    posts = your_db.query.filter_by(author=username).offset(page*pagesize).limit(pagesize).all()
    # 判断是否还有更多数据
    has_more = len(posts) == pagesize
    return posts, has_more

@app.route('/feed')
def feed():
    username = session.get('username')
    page = request.args.get("page", 0, type=int)
    posts, has_more = get_feed_posts(username, page=page)
    next_page = page + 1 if has_more else None
    
    # 区分普通请求和HTMX异步请求:HTMX请求只返回帖子块,普通请求返回完整页面
    if request.headers.get('HX-Request'):
        return render_template("feed_posts.html", posts=posts, next_page=next_page)
    return render_template("feed.html", posts=posts, next_page=next_page)

2. 拆分模板

  • feed.html(完整页面容器):
<div id="posts-container">
    {% include "feed_posts.html" %}
</div>
  • feed_posts.html(帖子列表及加载触发器):
{% from 'macros.html' import post_block %}
{% for post in posts %}
    {% if post[7] != "off" %}
        {{ post_block(post) }}
    {% endif %}
{% endfor %}

{% if next_page %}
<div hx-get="/feed?page={{ next_page }}"
     hx-trigger="revealed"
     hx-swap="beforeend"
     hx-target="#posts-container"
     hx-indicator="#loading">
</div>
<div id="loading" class="htmx-indicator">加载更多帖子...</div>
{% endif %}

关键要点

  • 用HX-Request请求头区分请求类型,优化加载性能
  • hx-swap="beforeend"确保新帖子追加到容器末尾,不覆盖原有内容
  • 加载指示器提升用户感知,无更多数据时自动停止加载

内容的提问来源于stack exchange,提问作者Corie LeClair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:27:45