私のサイトには、グループ コメント専用のページがあります。ユーザーは投稿 (つまり、質問やコメント) を作成でき、他のユーザーはそれらにコメントできます。コメント階層は Facebook と同じです。reddit のようなコメント スレッドはありません。ヘロクを使用。
このページを最適化するために django-debug-toolbar を使用しています。現在、ページは 5 ~ 6 秒で読み込まれます。これは、ブラウザがサーバーからの応答を待つ時間です (JS/CSS/IMG の読み込み時間は含まれません)。読み込みに 80 ~ 100 ミリ秒かかる 30 の SQL クエリがあります (関連する m2m フィールドで prefetch_related を使用しています)。返されるページのサイズは 344KB で、モンスター ページではありません。コメントはページ分割されており、10 件の投稿とすべてのコメントのみを返しています (テストでは、各投稿には 3 ~ 4 件のコメントしかありません)。
SQL クエリの完了に最大 100 ミリ秒しかかからないのに、ページの読み込みになぜこんなに時間がかかるのかわかりません。
以下は関連するコードです。「posts」オブジェクトを取得し、for ループを使用して各オブジェクトをレンダリングしています。その「投稿」for ループ内で、「コメント」用に別の 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 %}