1

私のサイトには、グループ コメント専用のページがあります。ユーザーは投稿 (つまり、質問やコメント) を作成でき、他のユーザーはそれらにコメントできます。コメント階層は 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 %}
4

1 に答える 1

0

私が理解しているように、これはSQLクエリではなくアバター画像に関連しています。S3 のようなリモート ストレージの操作は少し遅いです。ただし、上記で直面したように、ユーザー エクスペリエンスを妨げるべきではありません。

「アバター」画像を取得するために使用しているものを取得できませんでしたが、次のようなサードパーティのパッケージを使用することをお勧めします。

  1. Easy_thumbnails - とても便利で、たくさんのオプションがあります。私は最近、このあなたに移行しました。リモートストレージの場合、セロリでアバターを事前生成し、保存されたサムネイルを提供できます

  2. sorl-thumbnail - 以前のプロジェクトでこれを使用しました。事前生成するオプションがないため、最初のリクエストは遅くなります。ただし、サムネイルが作成されると、次のリクエストは高速になります。スマートキャッシングがあります。セロリで使用するためにここでフォークしようとしましたhttps://github.com/neokya/sorl-thumbnail-async

お役に立てば幸いです。

于 2013-07-22T14:41:10.847 に答える