思考:
美多**的首頁訪問頻繁,而且查詢資料量大,其中還有大量的迴圈處理。
問題:使用者訪問首頁會耗費伺服器大量的資源,並且響應資料的效率會大大降低。
解決:頁面靜態化
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 降低伺服器的響應時...