目录
1、什么是“页面静态化”?
答:页面指的是完整的html页面(模版+动态数据)。
静态化指的就是,提前渲染出完整的html页面,以静态文件的形式存起来,那么下一次浏览器访问的时候,直接返回该静态文件就可以了。避免频繁地渲染页面;
面临问题:网站首页(index.html)的访问频次是非常之高的,如果采用动态渲染的方式,每一次浏览器都需要请求动态服务器获取数据,然后渲染,那么咱们的动态服务器负载就会非常之高!
思考:网站首页(index.html)页面内容,基本不变(变化频率低),且该页面却经常被访问;我们就可以,提前渲染好该页面,浏览器请求该页面,我们直接返回该静态页面,无需动态请求数据;
2、安装集成django的定时任务模块——django-crontab
首页静态化函数,需要定时定期执行;我们采用定时任务交给机器去完成!
先在Django中写一个渲染首页的方法
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)
2.1 安装包:
pip install django-crontab -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 在Django的配置文件中配置定时任务
1、注册应用
INSTALLED_APPS = [
# .....
'django_crontab', # 定时任务
# .....
]
2、指定规则
# 指定定时任务规则
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'))
]
# 如果定时任务执行报编码错误,加入以下2项配置
# ubuntu
# CRONTAB_COMMAND_PREFIX = 'LANG_ALL=zh_cn.UTF-8'
# mac
# CRONTAB_COMMAND_PREFIX = 'LANG=zh_cn.UTF-8'
3.通过命令添加、查看和删除任务
# 添加任务(根据配置文件自动查找任务)
python3 manage.py crontab add
# 查看当前活跃的任务
python3 manage.py crontab show
# 删除任务
python3 manage.py crontab remove
3、APScheduler定时任务
特点:
-
不依赖于Linux系统的crontab系统定时,独立运行
-
可以动态添加新的定时任务,如:
下单后30分钟内必须支付,否则取消订单,就可以借助此工具(每下一单就要添加此订单的定时任务) -
对添加的定时任务可以做持久保存
话不多说,安装包即可,太慢就换个源
pip install apscheduler
演示代码:
from apscheduler.schedulers.background import BackgroundScheduler, BlockingScheduler
from apscheduler.executors.pool import ProcessPoolExecutor, ThreadPoolExecutor
# BackgroundScheduler 后台执行的调度器对象 - 依赖项目运行
# BlockingScheduler 阻塞式的调度器对象 - 单独构建定时任务服务器,阻塞,防止程序退出
# 创建进程池
processPool = ProcessPoolExecutor(max_workers=20) # 最多20个进程同时执行
# ===============1.执行器==============
executors = {
'default': processPool
}
# ===============2.调度器==============
scheduler = BlockingScheduler(executors=executors)
def job_func(app):
print("任务被调用了", app)
# =================3.触发器=============
# cron:按照周期,每天凌晨3点执行
# scheduler.add_job(job, "cron", hour=3)
# interval:经过指定的时间间隔执行
# date:在特定的时间日期执行
# 立即执行
scheduler.add_job(job_func, "date", args=["app"])
scheduler.start()
扩展:任务管理
方式1
job = scheduler.add_job(myfunc, ‘interval’, minutes=2) # 添加任务
job.remove() # 删除任务
job.pause() # 暂定任务
job.resume() # 恢复任务
方式2
scheduler.add_job(myfunc, ‘interval’, minutes=2, id=‘my_job_id’) # 添加任务
scheduler.remove_job(‘my_job_id’) # 删除任务
scheduler.pause_job(‘my_job_id’) # 暂定任务
scheduler.resume_job(‘my_job_id’) # 恢复任务
调整任务调度周期
job.modify(max_instances=6, name=‘Alternate name’)
scheduler.reschedule_job(‘my_job_id’, trigger=‘cron’, minute=’*/5’)
停止APScheduler运行
scheduler.shutdown()
4、Django中使用django-apscheduler定时任务
1、安装模块
pip install django-apscheduler
2、配置
1)修改settings.py文件,在INSTALLED_APPS
中加入django-apscheduler
应用:
INSTALLED_APPS = [
......
'django_apscheduler',# 定时执行任务
]
2)执行迁移命令:
python manage.py migrate
3、使用
在任意一个views.py文件中加入实现代码,使得每次启动Django框架时,定时任务都会同时启动。代码如下:
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
#开启定时工作
try:
# ==================1.实例化调度器====================
scheduler = BackgroundScheduler()
# ============2.调度器使用DjangoJobStore()====================
scheduler.add_jobstore(DjangoJobStore(), "default")
# ==============3.设置定时任务=================
# 另一种方式为每天固定时间执行任务,对应代码为
@register_job(scheduler,"cron", hour=4)
def my_job():
# 这里写你要执行的任务
pass
# ================4.注册定时任务=====================
register_events(scheduler)
# 5.开启定时任务
scheduler.start()
except Exception as e:
print(e)
# 有错误就停止定时器
scheduler.shutdown()