如何用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
相关产品推荐
相关产品推荐

