034 效能優化 頁面靜態化

2021-09-23 15:44:00 字數 4870 閱讀 9225

思考:

美多**的首頁訪問頻繁,而且查詢資料量大,其中還有大量的迴圈處理。

問題:使用者訪問首頁會耗費伺服器大量的資源,並且響應資料的效率會大大降低。

解決:頁面靜態化

1.為什麼要做頁面靜態化

2.什麼是頁面靜態化

3.頁面靜態化注意點

1.首頁頁面靜態化實現步驟

2.首頁頁面靜態化實現

def generate_static_index_html():

"""生成靜態的主頁html檔案

"""print('%s: generate_static_index_html' % time.ctime())

# 獲取商品頻道和分類

categories = get_categories()

# 廣告內容

contents = {}

content_categories = contentcategory.objects.all()

for cat in content_categories:

contents[cat.key] = cat.content_set.filter(status=true).order_by('sequence')

# 渲染模板

context =

# 獲取首頁模板檔案

template = loader.get_template('index.html')

# 渲染首頁html字串

html_text = template.render(context)

# 將首頁html字串寫入到指定目錄,命名'index.html'

file_path = os.path.join(settings.staticfiles_dirs[0], 'index.html')

with open(file_path, 'w', encoding='utf-8') as f:

f.write(html_text)

3.首頁頁面靜態化測試效果

$ pip install django-crontab

定時時間基本格式 :

* * * * *

分 時 日 月 周 命令

m: 分鐘(0-59)。每分鐘用 * 或者 */1 表示

h:小時(0-23)。(0表示0點)

d:天(1-31)。

m: 月(1-12)。

d: 一星期內的天(0~6,0為星期天)。

定時任務分為三部分定義:

cronjobs = [

# 每1分鐘生成一次首頁靜態檔案

('*/1 * * * *', 'contents.crons.generate_static_index_html', '>> ' + os.path.join(os.path.dirname(base_dir), 'logs/crontab.log'))

]

解決 crontab 中文問題

crontab_command_prefix = 'lang_all=zh_cn.utf-8'

4.管理定時任務

# 新增定時任務到系統中

$ python manage.py crontab add

# 顯示已啟用的定時任務

$ python manage.py crontab show

# 移除定時任務

$ python manage.py crontab remove

靜態化說明:

注意:1.準備指令碼目錄和python指令碼檔案

2.指定python指令碼解析器

#!/usr/bin/env python

3.新增python指令碼導包路徑

#!/usr/bin/env python

import sys

sys.path.insert(0, '../')

4.設定python指令碼django環境

#!/usr/bin/env python

import sys

sys.path.insert(0, '../')

import os

if not os.getenv('django_settings_module'):

os.environ['django_settings_module'] = 'meiduo_mall.settings.dev'

import django

django.setup()

5.編寫靜態化詳情頁python指令碼**

#!/usr/bin/env python

import sys

sys.path.insert(0, '../')

import os

if not os.getenv('django_settings_module'):

os.environ['django_settings_module'] = 'meiduo_mall.settings.dev'

import django

django.setup()

from django.template import loader

from django.conf import settings

from goods import models

from contents.utils import get_categories

from goods.utils import get_breadcrumb

def generate_static_sku_detail_html(sku_id):

"""生成靜態商品詳情頁面

:param sku_id: 商品sku id

"""# 獲取當前sku的資訊

sku = models.sku.objects.get(id=sku_id)

# 查詢商品頻道分類

categories = get_categories()

# 查詢麵包屑導航

breadcrumb = get_breadcrumb(sku.category)

# 構建當前商品的規格鍵

sku_specs = sku.specs.order_by('spec_id')

sku_key =

for spec in sku_specs:

# 獲取當前商品的所有sku

skus = sku.spu.sku_set.all()

# 構建不同規格引數(選項)的sku字典

spec_sku_map = {}

for s in skus:

# 獲取sku的規格引數

s_specs = s.specs.order_by('spec_id')

# 用於形成規格引數-sku字典的鍵

key =

for spec in s_specs:

# 向規格引數-sku字典新增記錄

spec_sku_map[tuple(key)] = s.id

# 獲取當前商品的規格資訊

goods_specs = sku.spu.specs.order_by('id')

# 若當前sku的規格資訊不完整,則不再繼續

if len(sku_key) < len(goods_specs):

return

for index, spec in enumerate(goods_specs):

# 複製當前sku的規格鍵

key = sku_key[:]

# 該規格的選項

spec_options = spec.options.all()

for option in spec_options:

# 在規格引數sku字典中查詢符合當前規格的sku

key[index] = option.id

option.sku_id = spec_sku_map.get(tuple(key))

spec.spec_options = spec_options

# 上下文

context =

template = loader.get_template('detail.html')

html_text = template.render(context)

file_path = os.path.join(settings.staticfiles_dirs[0], 'detail/'+str(sku_id)+'.html')

with open(file_path, 'w') as f:

f.write(html_text)

if __name__ == '__main__':

skus = models.sku.objects.all()

for sku in skus:

print(sku.id)

generate_static_sku_detail_html(sku.id)

1.新增python指令碼檔案可執行許可權

$ chmod +x regenerate_detail_html.py

2.執行批量靜態化詳情頁指令碼檔案

$ cd ~/projects/meiduo_project/meiduo_mall/scripts

$ ./regenerate_detail_html.py

# 進入到static上級目錄

$ cd ~/projects/meiduo_project/meiduo_mall/meiduo_mall

# 開啟測試靜態伺服器

4 查詢效能優化技術之頁面靜態化

cdn一邊返回對應的檔案,一邊將檔案按照http指示的生命週期快取起來,以便下次使用者訪問時,直接返回。cdn有很多的加速節點,當使用者請求cdn的時候,cdn會返回乙個就近的節點為他加速,如果cdn中有相應的檔案,就立刻返回,如果沒有相應的檔案,就訪問源站 nginx伺服器 cache contr...

關於優化,頁面靜態化

現在網際網路發展越來越迅速,對 的效能要求越來越高,也就是如何應對高併發量。像 12306 需要應付上億人同時來搶票,所以,如何提高 的效能,是做 都需要考慮的。1,使用快取,最傳統的一級二級快取 2,將服務和資料庫分開,使用不同的伺服器 分工更加明確 效率更加高 3,分布式,提供多台伺服器,利用反...

php頁面靜態化 優化頁面響應時間

如 動態頁面靜態化 優化資料庫 使用負載均衡 使用快取等都可以優化頁面響應時間。如果頁面中的一些內容不經常改動 幾個小時 幾天或更久不做改動 這個時候將動態頁面靜態化是非常有效的加速方法 比如 新聞發布系統 文章發布系統等 動態頁面靜態化的好處 1 減少伺服器指令碼的計算時間 2 降低伺服器的響應時...