1. 程式人生 > >django 專案效能優化

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, } }
  • 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次,那麼這些就是可以優化的線索