django中python的速度优化

sbtkgmzw  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(451)

我正在构建一个博客应用程序,我也在考虑在其中实现视频帖子。我正试图在开发和生产中优化web应用程序的速度。
在过去的几个月里,我在Pythonywhere上部署了许多在django中构建的站点。我注意到大多数网站都包含以下简单功能: Create , Edit , Image Upload , ListView , DetailView 博客的数量等等 500 to 600 lines of Code (python) . 但即使只有2到5页,它们也非常慢。
谈到发展:-
当我打开一个包含100到150个带有图片的博客的页面时,打开该页面需要2到3秒,然后我认为这可能是因为更多的博客和查询,然后我使用django debug工具栏检查了页面的查询和查询时间,然后我删除了所有的帖子,除了我在中看到的一篇帖子 debug-toolbar ,正在放映 Total time to load the Page is 600毫秒。
6到8毫秒内有4个查询
我删除了一些查询,但结果仍然相同。
我也搜索了一下,然后我发现了一篇使用select_related优化查询的帖子,然后我也使用了它,但我没有看到任何改进。
我以前做的越来越多 for loops 作为一个初学者 Template 但后来我在某个地方读到(对不起,我不记得来源)“使用逻辑功能,如 for loop , if elseviews 而不是 templates ".
谈到生产:-
在我的生产站点中——登录、创建或上传文件,在站点中加载图像在站点中看起来相当慢。所以我认为这可能是因为我使用的数据库,所以我联系他们询问数据库是否会降低网站速度(性能),然后他们说:-
站点的速度在很大程度上取决于为处理传入请求而编写的代码的速度。特定的数据库可能不会对图像下载的速度产生影响,但您不使用静态文件系统的事实会影响图像下载的速度。
但我只是像其他人一样编写代码来显示博客帖子列表,我正在使用 MEDIA ROOTSTATIC files 之后,图像仍在缓慢加载。
我还根据django关于性能和优化的文档工作,比如:-使用 counting objects using .count() will increase the speed .
在那之后,我仍然没有找到任何完美的解决方案来优化网站 ProductionDevelopment .
我正在研究并试图优化网站的博客web应用的视图和模型
models.py

class BlogPost(models.Model):
    user = models.ForeignKey(User,default='',null=True,on_delete = models.CASCADE)
    title = models.CharField(max_length=500,default='',validators=[validate_is_profane])
    description = models.TextField()
    date = models.DateTimeField(null=True,default=timezone.now)
    image = models.ImageField(upload_to='blog_posts',blank=True,null=True)
    slug = models.SlugField(null=True)

views.py

def posts(request):
    blog_profile = get_object_or_404(Profile, user_id=request.user)
    now = timezone.now()
    posts = Post.objects.filter(date__lte=now).order_by('-date').exclude(user=request.user)

    if request.method == 'POST':
        new_blog_post = BlogPostForm(request.POST,
                                    request.FILES,
                                    instance=request.user.profile)

        if which_post_form.is_valid():
            new_blog_post = new_blog_post.save(commit=False)
            new_blog_post.save()
            return redirect('home')

    else:
        new_blog_post = BlogPostForm(instance=request.user.profile)

    context = {
        'posts':posts,
        'blog_profile':blog_profile,
        'new_blog_post':new_blog_form,
    }

    return render(request, 'post_list.html', context)

post_list.html

{% for topic in posts %}

<br>

<a href="{% url 'user_profile' user.id %}">{{ topic.user }}</a>

<p>{{ topic.title|truncatechars:10 }}</p>

{% if topic.image %}
<br>
<a><img src="{{ topic.image.url }}" id="myImg" width="300"></a>
<br>
{% endif %}

<div id="myModal" class="modal">
    <span class="close">&times;</span>
    <img class="modal-content" id="img01">
    <div id="caption"></div>
</div>

<a>{{ topic.description|slice:":10" }}</a>

<a href="{{ topic.get_absolute_url }}">More</a>

{% endblock content %}

如果你有任何进一步的解决方案,你如何优化你的网站。那么我将非常感谢你的回答和建议。

3z6pesqy

3z6pesqy1#

如果您有大量数据,我发现有两种情况可能会导致性能不佳,其中第一种情况更可能是一个问题:
访问 topic.user 在模板中,将对中的每个项目进行额外查询 posts 默认情况下,由于该属性访问需要加载 User 从不同的表中创建模型。做一个 select_related('user') 当你得到你的 Post queryset将在与帖子相同的查询中加载用户信息:

Post.objects.filter(date__lte=now) \
    .order_by('-date') \
    .exclude(user=request.user) \
    .select_related('user')

我强烈怀疑,通过这种方式避免每篇文章进行查询将解决性能问题,因为如果一个典型的查询需要大约10毫秒,而您需要进行数百次查询,那么很容易将响应时间缩短到几秒钟。由于您实际上没有读取大量数据,因此查询所需的时间将主要由固定开销控制,您只需执行较少的查询即可避免这些开销。
虽然这不太可能是一个问题,除非你有大量的职位(数万或更多),订购你的 Post 经过 date 将要求数据库读取表中的每一行,并在返回任何行之前对它们进行排序。对于几百个对象,这一成本可以忽略不计,但对于数千个对象,这一成本会更低。
如果在查询和排序依据的字段上添加索引,则可以帮助数据库高效地执行以下操作:

class Post(models.Model):
    ...
    class Meta:
        indexes = [
            models.Index(fields=['-date'], name='date_ordering'),
        ]

相关问题