【问题标题】:Django - troubleshooting slow page load times for a comments pageDjango - 解决评论页面的缓慢页面加载时间
【发布时间】:2013-07-22 23:02:03
【问题描述】:

我的网站上有一个专门用于组 cmets 的页面。用户可以创建帖子(即问题或 cmets),其他用户可以对其发表评论。评论层次与 Facebook 相同;没有像 reddit 这样的评论线程。使用 Heroku。

我正在使用 django-debug-toolbar 来优化这个页面。现在页面在 5-6 秒内加载;这只是我的浏览器等待服务器响应的时间(不包括 JS/CSS/IMG 加载时间)。加载 30 个 SQL 查询需要 80-100 毫秒(我在相关的 m2m 字段上使用 prefetch_related)。返回的页面大小为 344KB,因此根本不是怪物页面。 cmets 是分页的,我只返回 10 个帖子 + 所有 cmets(在测试中每个帖子只有 3-4 个 cmets)。

当 SQL 查询最多只需要 100 毫秒才能完成时,我不明白为什么加载页面需要这么长时间。

下面是相关代码。我正在取回“帖子”对象并使用 for 循环来渲染每个对象。在那个'posts' for 循环中,我正在为'cmets' 做另一个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 之类的远程存储吗?
  • Django 调试工具栏对于分析 SQL 查询非常有用,但我发现它会显着减慢页面加载速度。如果禁用调试工具栏,页面是否仍然加载缓慢?
  • @neokya,哈哈 - 刚刚禁用了所有与头像/图像相关的调用,页面在 1-2 秒内返回(我在新加坡,使用 us-east Heroku)。我正在使用 django-storages/S3。所以我想现在的问题是,如何在不阻碍页面加载的情况下获取个人资料图片。 Alasdair - 你是对的,它确实减慢了整个页面的加载速度。但在这种情况下,django-storages/S3 负载似乎是更大的罪魁祸首。
  • 啊,我找到你了,你用什么做头像?用户上传头像或您从上传的图像创建缩略图?

标签: django amazon-s3 django-templates django-views


【解决方案1】:

据我了解,这与头像图像有关,与 SQL 查询无关。使用像 S3 这样的远程存储有点慢。但它不应该像您在上面所面临的那样妨碍用户体验。

我没有得到您用来获取“头像”图像的内容,但我建议您使用一些第三方软件包,例如。

  1. Easy_thumbnails - 真的很好,有很多选择。我最近转移到这个你。在远程存储的情况下,您可以使用 celery 预生成头像并提供保存的缩略图

  2. sorl-thumbnail - 我在之前的项目中使用过这个。它没有预生成选项,因此第一个请求很慢。但是一旦创建了缩略图,下一个请求就会很快。它具有智能缓存。我尝试在这里 fork 与 celery 一起使用 https://github.com/neokya/sorl-thumbnail-async

我希望它有所帮助。

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多