提高django性能

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ll641058431/article/details/78267983

性能优化是一件困难的事情,但是也不常常如此: 
下面4步将能够轻松的提高你的网站的性能,它们非常简单你应该将它们 
作为标配。

持久化数据库连接

django1.6以后已经内置了数据库持久化连接,很多人使用PostgreSQL作为它们的线上数据库系统,而当我们连接PostgreSQL有时会显得很慢,这里我们可以进行优化。 
没有持久化连接,每一个网站的请求都会与数据库建立一个连接。如果数据库不在本地,尽管网速很快,这也将花费20-75ms.

设置持久化连接,仅需要添加CONN_MAX_AGE参数到你的数据库设置中:

DATABASES = {
    ‘default’: {
        ‘ENGINE’: ‘django.db.backends.postgresql_psycopg2’,
        ‘NAME’: ‘whoohoodb’,
        ‘CONN_MAX_AGE’: 600,
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

通过这样的设置,我们设置的持久化连接每次都将存活10分钟 
这有助于减少内存泄漏或导致一种片状连接的问题。 
你可设置更长的时间,但是我不要设置超过1个小时,因为这样获得的效果不会太好。你可以从django的帮助文档中获取详细信息 django持久化连接

模版加载

默认django使用两个标准的模版加载器

TEMPLATE_LOADERS = (
    ‘django.template.loaders.filesystem.Loader’,
    ‘django.template.loaders.app_directories.Loader’,
)
  • 1
  • 2
  • 3
  • 4
  • 5

每一个请求,这些模版加载器都会去文件系统搜索,然后解析这些模版。 
这里可以感觉到,它是不是可以处理的更快了? 
你可以开启缓存加载,因此django只会查找并且解析你的模版一次 
配置如下:

TEMPLATE_LOADERS = (
    (‘django.template.loaders.cached.Loader’, (
        ‘django.template.loaders.filesystem.Loader’,
        ‘django.template.loaders.app_directories.Loader’,
    )),
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

但是,不要在开发环境中开启缓存加载,这样会很烦人的,因为每次模版做了修改之后你都需要重启服务才能看到修改后的效果

优化django会话

很多人不知道django的session的存储,django存储sessions在数据库中,并希望有时候能够清理掉一些不用了的,但是很少人会这么做。 
这样的话每一个请求都要使用sql查询会话数据,然后获得用户对象的信息。 
一些对性能比较关心的人,会使用memory cache或者redis来缓存一些东西,这样的话,你可以将你的会话放到缓存数据库中,因此轻松移除掉每一次请求都会去进行sql查询的所耗费的时间。 
设置如下:

SESSION_ENGINE = ‘django.contrib.sessions.backends.cache
  • 1

前面假设你可以丢失任何存储的会话,如果不是那样的话,像下面这样配置:

SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db’
  • 1

这里,后台会缓存数据,并同时会把修改的内容写入到数据库中长期保存

select_related() 和 prefetch_related()

相比于修改数据库存储,这里只要需要简单的设置select_related()和prefetch_related(),在使用ORM的情况下,他能够减少sql查询的数量。 
这里有一个BlogPost模型,它有一个用户外键,获得了一个listview

queryset = BlogPost.objects.active
  • 1

那么在模版中是这样使用:

<ul>
{% for post in object_list %}
  <li>{{ post.title }} - {{ post.user.email }}</li>
{% endfor %}
</ul>
  • 1
  • 2
  • 3
  • 4
  • 5

这里满足了预期的效果,但是每个post都会去查询auth_user表。为了解决这个问题,可以让djangode的ORM在前面就连接上auth_user 表,这样object.user就是一个可以直接用的对象了,这样BlogPost.objects.active().count()就会变成一个简单的查询

修改如下:

queryset = BlogPost.objects.select_related().active()
  • 1

prefetch_related的机理是相同的


当感到疑惑时,开启django调试工具,然后分析每次请求的查询次数和时间,如果每次查询都要用上5~10次,那么这些就是可以优化的线索

展开阅读全文

没有更多推荐了,返回首页