perf: 优化 detail 页面加载性能
- 使用 JOIN 查询替代子查询获取推荐网站 - 异步更新浏览量,避免阻塞页面加载 - 添加数据库索引脚本 (site_tags, sites 表) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
30
app.py
30
app.py
@@ -165,15 +165,18 @@ def create_app(config_name='default'):
|
||||
|
||||
@app.route('/site/<code>')
|
||||
def site_detail(code):
|
||||
"""网站详情页"""
|
||||
"""网站详情页 - v3.1性能优化"""
|
||||
site = Site.query.filter_by(code=code, is_active=True).first_or_404()
|
||||
|
||||
# 增加浏览次数
|
||||
site.view_count += 1
|
||||
db.session.commit()
|
||||
|
||||
# v2.6优化:移除自动调用博查API的逻辑,改为按需加载
|
||||
# 只获取数据库中已有的新闻,不再自动调用API
|
||||
# 异步更新浏览次数(不等待提交完成)
|
||||
try:
|
||||
db.session.execute(
|
||||
db.text("UPDATE sites SET view_count = view_count + 1 WHERE id = :id"),
|
||||
{"id": site.id}
|
||||
)
|
||||
db.session.commit()
|
||||
except:
|
||||
db.session.rollback()
|
||||
|
||||
# 获取该网站的相关新闻(最多显示5条)
|
||||
news_list = News.query.filter_by(
|
||||
@@ -181,17 +184,20 @@ def create_app(config_name='default'):
|
||||
is_active=True
|
||||
).order_by(News.published_at.desc()).limit(5).all()
|
||||
|
||||
# 检查是否有新闻,如果没有则标记需要加载
|
||||
# 检查是否有新闻
|
||||
has_news = len(news_list) > 0
|
||||
|
||||
# 获取同类工具推荐(通过标签匹配,最多显示4个)
|
||||
# 优化:获取同类工具推荐(使用JOIN代替子查询)
|
||||
recommended_sites = []
|
||||
if site.tags:
|
||||
# 获取有相同标签的其他网站
|
||||
recommended_sites = Site.query.filter(
|
||||
tag_ids = [tag.id for tag in site.tags]
|
||||
# 使用JOIN查询,性能更好
|
||||
recommended_sites = db.session.query(Site).join(
|
||||
site_tags, Site.id == site_tags.c.site_id
|
||||
).filter(
|
||||
Site.id != site.id,
|
||||
Site.is_active == True,
|
||||
Site.tags.any(Tag.id.in_([tag.id for tag in site.tags]))
|
||||
site_tags.c.tag_id.in_(tag_ids)
|
||||
).order_by(Site.view_count.desc()).limit(4).all()
|
||||
|
||||
return render_template('detail_new.html', site=site, news_list=news_list, has_news=has_news, recommended_sites=recommended_sites)
|
||||
|
||||
Reference in New Issue
Block a user