2013-07-22 80 views
1

我在我的網站上有一個專門用於評論組的頁面。用戶可以創建帖子(即問題或評論),其他用戶可以對其發表評論。評論層級與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 %} 
+1

它可能與頭像有關。你在用什麼?你還使用像S3一樣的遠程存儲? – chhantyal

+0

Django調試工具欄對分析SQL查詢非常有用,但我發現它可以顯着減慢頁面加載速度。如果禁用調試工具欄,頁面是否仍然緩慢加載? – Alasdair

+0

@neokya,ha - 剛剛禁用了所有與頭像/圖片相關的電話,並且該網頁稍後在1-2秒內返回(我在新加坡並使用我們的東邊Heroku)。我正在使用django-storage/S3。所以我想現在的問題是,如何在沒有陷入頁面負載的情況下獲取配置文件圖像。阿拉斯代爾 - 你說得對,它確實減緩了整頁的加載速度。但在這種情況下,django-storage/S3負載似乎是一個更大的罪魁禍首。 – tabdon

回答

0

據我瞭解,這是給形象的圖像,而不是SQL查詢有關。使用像S3這樣的遠程存儲有點慢。但是它不應該妨礙用戶體驗,就像你在上面遇到的那樣。

我沒有得到你用來獲取'頭像'圖像,但我會建議使用一些第三方包。

  1. Easy_thumbnails - 這真的很不錯,有很多選擇。我最近轉向了你。在遠程存儲的情況下,您可以使用芹菜預先生成頭像,並保存縮略圖。

  2. sorl-thumbnail - 我將此用於我之前的項目。它沒有預生成選項,所以第一個請求很慢。但一旦創建縮略圖,下一個請求將會很快。它具有智能緩存。我試圖把它叉到這裏用芹菜使用https://github.com/neokya/sorl-thumbnail-async

我希望它有幫助。