我的网站上有一个专门用于群组评论的页面。用户可以创建帖子(即问题或评论),其他用户可以对其进行评论。评论层次结构与Facebook相同;没有像reddit那样的评论线程。使用Heroku。
我正在使用django-debug-toolbar来优化此页面。现在页面加载5-6秒;这就是我的浏览器等待服务器响应的时间(不包括JS / CSS / IMG加载时间)。有30个SQL查询需要加载80-100ms(我在相关的m2m字段上使用prefetch_related)。返回的页面大小为344KB,因此根本不是怪物页面。评论是分页的,我只返回10个帖子+所有评论(在测试中每个帖子只有3-4条评论)。
我无法弄清楚为什么在SQL查询只需要100毫秒才能完成时加载页面需要这么长时间。
以下是相关代码。我正在取回'posts'对象并使用for循环来渲染每个对象。在'posts'for循环中,我正在为'comments'做另一个for循环。
我还能做些什么来进一步优化/减少页面加载时间?
# views.py
def group_app(request, course_slug):
# get the group & plan objects
group = Group.objects.get(slug=course_slug)
# load the page with a new Post and comment form
group_post_form = newGroupPost()
post_comment_form = newPostComment(auto_id=False)
# gather all the Posts that have already been created
group_posts = GroupPost.objects.filter(group=group).prefetch_related('comments', 'member', 'group')
paginator = Paginator(group_posts, 10)
page = request.GET.get('page')
try:
posts = paginator.page(page)
except PageNotAnInteger:
page = 1
posts = paginator.page(page)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
variables = RequestContext(request, {
'group': group,
'group_post_form': group_post_form,
'posts': posts,
'next_page': int(page) + 1,
'has_next': posts.has_next(),
'post_comment_form': post_comment_form
})
if request.is_ajax():
return render_to_response('group-post.html', variables)
else:
return render_to_response('group-app.html', variables)
# group-app.html
{% extends 'base.html' %}
{% block canvas %}
<div id="group-body" class="span8">
{% include "group-body.html" %}
</div>
{% endblock canvas %}
# group-body.html
{% for post in posts %}
{% include 'group-post-item.html' %}
{% endfor %}
# group-post-item.html
{% with post_avatar=post.member.get_profile.medium_image.url %}
<div class="groupPost" id="{{ post.id }}">
<div class="avatarContainer">
{% if post_avatar %}
<img class="memberAvatar" src="{{ post_avatar }}" alt="">
{% else %}
<img class="memberAvatar" src="{{ STATIC_URL }}img/generic-avatar.png">
{% endif %}
</div>
<div class="postContents">
<div class="groupPostComment">
<h6 class="comment-header">SHOW/ADD COMMENTS</h6>
<div class="comments">
{% for comment in post.comments.all %}
{% with comment_avatar=comment.member.get_profile.medium_image.url %}
<div class="commentText">
<p class="comment-p">{{ comment.comment }}</p>
</div>
{% endwith %}
{% endfor %}
</div>
</div>
</div>
</div>
{% endwith %}
答案 0 :(得分:0)
据我所知,这与头像图像有关,而与SQL查询无关。使用像S3这样的远程存储有点慢。但它不应该妨碍您在上面遇到的用户体验。
我没有得到你正在使用的'avatar'图像,但我建议使用一些第三方软件包。
Easy_thumbnails - 非常好,有很多选择。我最近转向你了。如果是远程存储,您可以使用芹菜预生成头像并提供保存的缩略图
sorl-thumbnail - 我将此用于我之前的项目。它没有预生成选项,因此第一个请求很慢。但是一旦创建了缩略图,下一个请求就会很快。它有智能缓存。我试图在这里用它来与芹菜https://github.com/neokya/sorl-thumbnail-async
我希望它有所帮助。