我在我的網站上有一個專門用於評論組的頁面。用戶可以創建帖子(即問題或評論),其他用戶可以對其發表評論。評論層級與Facebook相同;沒有像reddit那樣的線程評論。使用Heroku。Django - 解決評論頁面加載時間較慢的問題
我正在使用django-debug-toolbar來優化此頁面。現在頁面在5-6秒內加載;這就是我的瀏覽器等待服務器響應的時間(不包括JS/CSS/IMG加載時間)。有30個SQL查詢需要80-100ms才能加載(在相關的m2m字段中使用prefetch_related)。返回的頁面大小爲344KB,根本不是怪物頁面。評論分頁,我只返回10篇文章+所有評論(在測試中,每篇文章只有3-4條評論)。
我不明白爲什麼需要這麼長時間來加載頁面時,SQL查詢只需要100ms才能完成。
下面是相關的代碼。我找回'posts'對象並使用for循環來呈現每個對象。在'posts'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 %}
它可能與頭像有關。你在用什麼?你還使用像S3一樣的遠程存儲? – chhantyal
Django調試工具欄對分析SQL查詢非常有用,但我發現它可以顯着減慢頁面加載速度。如果禁用調試工具欄,頁面是否仍然緩慢加載? – Alasdair
@neokya,ha - 剛剛禁用了所有與頭像/圖片相關的電話,並且該網頁稍後在1-2秒內返回(我在新加坡並使用我們的東邊Heroku)。我正在使用django-storage/S3。所以我想現在的問題是,如何在沒有陷入頁面負載的情況下獲取配置文件圖像。阿拉斯代爾 - 你說得對,它確實減緩了整頁的加載速度。但在這種情況下,django-storage/S3負載似乎是一個更大的罪魁禍首。 – tabdon