对于用户,没有登录时浏览的首页是一样的,首页内容不经常变化。
如果多个用户访问,访问的页面一样,那查询的数据库也是一样,何不把页面生成响应的静态页面?
那什么时候需要重新生成静态页面?
使用celery里边定义任务函数来生成静态页面。
当管理员后台修改了首页信息,对应表格中的数据的时候,需要重新生成首页静态页面。
django-celery+redis进行异步任务处理生成静态页面
Pip install django-celery=3.2.2
Pip install django-redis=4.10.0
pip install redis==2.10.6
Pip install flower #可视化平台
实现步骤:
配置settings
附settings代码:
import djcelery #导入django-celery模块
djcelery.setup_loader()#进行模块加载
BROKER_URL='redis://127.0.0.1:6379/1'#任务容器地址,redis数据库地址
CELERY_IMPORTS=('CeleryTask.tasks')#具体任务文件
CELERY_TIMEZONE='Asia/Shanghai'#celery时区
CELERYBEAT_SCHEDULER='djcelery.schedulers.DatabaseScheduler'#celey处理器
# celery 的定时器
from celery.schedules import crontab
from celery.schedules import timedelta
CELERYBEAT_SCHEDULE={#定时器策略
#定时任务一:每隔30s运行一次
u'测试定时器1':{
"task":"CeleryTask.tasks.generate_static_index_html",
# "task":"CeleryTask.tasks.taskExample",
#"schedule":crontab(minute='*/2'), #or 'schedule':timedelta(seconds)=3
"schedule":timedelta(seconds=60),
"args":(),
},
}
给celery创建独立的app
在项目的主目录下编写celery.py控制文件
在celeryapp下编写任务文件,文件名是tasks.py,一般为task.py这里我设置为了tasks.py
因为我们安装了djcelery app,所以,我们需要同步数据库
效果如下:
当配置完成celery之后python manage.py会多出很多命令,如下:
现在启动项目需要启动两个服务
Django
Django-celery
启动celery之前需要启动redis数据库
然后启动celery
python manage.py celery worker --loglevel=info
在视图当中触发一下celery任务
Celery的任务需要用delay函数触发
redis开启方法
redis-server.exe redis.windows.conf
redis关闭方法
redis-cli.exe
shutdown
配置nginx提供静态页面
只要django发出任务,celery就会生成对应静态文件,当用户访问这个页面的时候,我们可以让nginx来帮助提供静态页面。所以我们可以在celery上部署nginx服务器,由nginx帮助我们提供静态页面。用户可以直接访问nginx,nginx为其提供页面。那celery所在的电脑上nginx怎样配置呢?
nginx中可以加多个server,修改nginx的conf,多个server就相当于多台服务器
在conf文件中,location后的内容相当于url的配置项。
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /static {
alias /home/python/Desktop/dailyfresh/static/
}
#会去匹配最合适的那一项
location / {
#root html;
root /home/python/Desktop/dailyfresh/static/;
index index.html index.htm;
默认配置项,如果匹配不到会选择一个默认的网页进行返回。
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
注意:
重启nginx服务器,可以先pkill,在nginx
通过 ps|aux|grep nginx 可以查看nginx进程
重启成功之后,这样就可以访问两个端口
如果访问ip地址时不加端口号,那默认访问80端口。
完成以上这样就可以访问nginx,让nginx来帮助我们提供静态页面。
修改数据后,如何重新生成静态页面?
管理员修改首页所使用的表中的数据时,重新生成静态页面。
前面提到,当后台管理员通过浏览器修改或删除对应表中的数据后,不光数据需要修改,django还要通过celery重新生成静态页。
每个后台管理可以定义一个模型管理类。那就需要让这个管理类继承于ModelAdmin.
ModelAdmin.save_model()添加、更新,前方法会被调用
ModelAdmin.delete_model() 删除,前方法会被调用
使用celery异步生成任务:修改完数据之后,不用celery生成静态页,将代码复制过来的话,那管理员的页面会卡很长时间。而celery速度会很快。
以上是以类继承BaseModelAdmin,减少了代码量,注意注册为后台管理类。
静态index页面和indexview的调度说明
当用户访问nginx服务器,但是django和nginx可能不在同一台电脑,
怎么去让用户直接访问index页面?
可以再增加一个nginx服务器负责调度,这个nginx拥有自己的ip,给用户暴露的就是这个nginx的ip,
请求流程:
先去访问外层的nginx,它会根据地址去做区分到底返回那个页面。
若直接访问nginx地址,那直接访问celery-nginx将静态页面发回,若访问index,可以将django网站进行返回。