簡單4步,提高django性能

性能優化是一件困難的事情,但是也不常常如此:
下面4步將能夠輕鬆的提高你的網站的性能,它們非常簡單你應該將它們
作爲標配。

持久化數據庫連接

django1.6以後已經內置了數據庫持久化連接,很多人使用PostgreSQL作爲它們的線上數據庫系統,而當我們連接PostgreSQL有時會顯得很慢,這裏我們可以進行優化。
沒有持久化連接,每一個網站的請求都會與數據庫建立一個連接。如果數據庫不在本地,儘管網速很快,這也將花費20-75ms.

設置持久化連接,僅需要添加CONN_MAX_AGE參數到你的數據庫設置中:

DATABASES = {
    ‘default’: {
        ‘ENGINE’: ‘django.db.backends.postgresql_psycopg2’,
        ‘NAME’: ‘whoohoodb’,
        ‘CONN_MAX_AGE’: 600,
    }
}

通過這樣的設置,我們設置的持久化連接每次都將存活10分鐘
這有助於減少內存泄漏或導致一種片狀連接的問題。
你可設置更長的時間,但是我不要設置超過1個小時,因爲這樣獲得的效果不會太好。你可以從django的幫助文檔中獲取詳細信息 django持久化連接

模版加載

默認django使用兩個標準的模版加載器

TEMPLATE_LOADERS = (
    ‘django.template.loaders.filesystem.Loader’,
    ‘django.template.loaders.app_directories.Loader’,
)

每一個請求,這些模版加載器都會去文件系統搜索,然後解析這些模版。
這裏可以感覺到,它是不是可以處理的更快了?
你可以開啓緩存加載,因此django只會查找並且解析你的模版一次
配置如下:

TEMPLATE_LOADERS = (
    (‘django.template.loaders.cached.Loader’, (
        ‘django.template.loaders.filesystem.Loader’,
        ‘django.template.loaders.app_directories.Loader’,
    )),
)

但是,不要在開發環境中開啓緩存加載,這樣會很煩人的,因爲每次模版做了修改之後你都需要重啓服務才能看到修改後的效果

優化django會話

很多人不知道django的session的存儲,django存儲sessions在數據庫中,並希望有時候能夠清理掉一些不用了的,但是很少人會這麼做。
這樣的話每一個請求都要使用sql查詢會話數據,然後獲得用戶對象的信息。
一些對性能比較關心的人,會使用memory cache或者redis來緩存一些東西,這樣的話,你可以將你的會話放到緩存數據庫中,因此輕鬆移除掉每一次請求都會去進行sql查詢的所耗費的時間。
設置如下:

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

前面假設你可以丟失任何存儲的會話,如果不是那樣的話,像下面這樣配置:

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

這裏,後臺會緩存數據,並同時會把修改的內容寫入到數據庫中長期保存

select_related() 和 prefetch_related()

相比於修改數據庫存儲,這裏只要需要簡單的設置select_related()和prefetch_related(),在使用ORM的情況下,他能夠減少sql查詢的數量。
這裏有一個BlogPost模型,它有一個用戶外鍵,獲得了一個listview

queryset = BlogPost.objects.active

那麼在模版中是這樣使用:

<ul>
{% for post in object_list %}
  <li>{{ post.title }} - {{ post.user.email }}</li>
{% endfor %}
</ul>

這裏滿足了預期的效果,但是每個post都會去查詢auth_user表。爲了解決這個問題,可以讓djangode的ORM在前面就連接上auth_user 表,這樣object.user就是一個可以直接用的對象了,這樣BlogPost.objects.active().count()就會變成一個簡單的查詢

修改如下:

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

prefetch_related的機理是相同的


當感到疑惑時,開啓django調試工具,然後分析每次請求的查詢次數和時間,如果每次查詢都要用上5~10次,那麼這些就是可以優化的線索

參考英文地址

發佈了68 篇原創文章 · 獲贊 15 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章