一个网页会有很多数据是不需要经常变动的,比如说首页,变动频率低而访问量大,我们可以把它静态化,这样就不需要每次有请求都要查询数据库再返回,可以减少服务器压力
所谓页面静态化,就是提前渲染出完整的html页面,以静态文件的形式存起来,那么下一次浏览器访问的时候,直接返回该静态文件就可以了
我们可以使用Django的模板渲染功能完成页面渲染
1.页面静态化
我们在Django项目里新建一个py文件,里面写一个渲染首页的方法
from django.template import loader
def generate_static_index_html():
# 先获取首页模版文件
template = loader.get_template('index.html')
# 要渲染的数据(动态数据)
context = {
'categories': None,
'contents': None
}
# 得到渲染后的完整页面
page = template.render(context)
# 把渲染后的文件保存起来
with open('XXXXXXX/front_end_pc/index.html', 'w') as f:
f.write(page)
我们打开Django提供的shell,cd到该py文件所在目录并且执行该文件即可得到静态化的页面
2.crontab定时任务
虽然页面不是经常更新,但是需要更新的时候也不可能每次都人为地去执行程序渲染新的页面吧。我们可以使用定时任务自动执行
2.1安装crontab
pip install django-crontab -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 在配置文件注册
我们打开Django的配置文件(这里是dev.py),在INSTALLED_APPS列表注册crontab
INSTALLED_APPS = [
.....
'django_crontab', # 定时任务
]
3.3 制定定时规则
crontab什么时候执行,时间间隔是多少,这些都需要在Django的配置文件(这里是dev.py)里进行设置。新建一个CRONJOBS列表
# 指定定时任务规则
CRONJOBS = [
# 写法是:(时间规则,要执行的任务,">>",日志文件位置)
# 每1分钟生成一次首页静态文件
# 分 时 日 月 周
('*/1 * * * *', 'apps.contents.crons.generate_static_index_html', '>> ' + os.path.join(BASE_DIR, 'logs/crontab.log'))
# 每月的23日12点1分0秒执行一次
# ('1 12 23 * *', 'apps.contents.crons.generate_static_index_html', '>> ' + os.path.join(BASE_DIR, 'logs/crontab.log'))
]
如果在执行过程中遇到非英文字符引发的字符异常,可以添加以下的配置
# ubuntu
CRONTAB_COMMAND_PREFIX = 'LANG_ALL=zh_cn.UTF-8'
# mac
CRONTAB_COMMAND_PREFIX = 'LANG=zh_cn.UTF-8'
3.4 管理任务
打开Django提供的shell,执行下面的命令管理任务
# 添加定时任务
python manage.py crontab add
# 显示已激活的定时任务
python manage.py crontab show
# 移除定时任务
python manage.py crontab remove