定时任务crontab和APScheduler——页面静态化

1、什么是“页面静态化”?

答:页面指的是完整的html页面(模版+动态数据)。
静态化指的就是,提前渲染出完整的html页面,以静态文件的形式存起来,那么下一次浏览器访问的时候,直接返回该静态文件就可以了。避免频繁地渲染页面

请求模版文件
请求动态数据
浏览器(模版+动态数据=渲染完整的页面)
静态服务器
动态服务

面临问题:网站首页(index.html)的访问频次是非常之高的,如果采用动态渲染的方式,每一次浏览器都需要请求动态服务器获取数据,然后渲染,那么咱们的动态服务器负载就会非常之高!

思考:网站首页(index.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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值