django-celery+redis异步页面静态化及nginx页面调度

对于用户,没有登录时浏览的首页是一样的,首页内容不经常变化。

如果多个用户访问,访问的页面一样,那查询的数据库也是一样,何不把页面生成响应的静态页面?

那什么时候需要重新生成静态页面?

使用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网站进行返回。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
我想将frontend 也是用volumes,将其映射到/app/frontend目录,在/app/frontend下install以及build,如何实现 docker-compose.yml文件: version: '3' services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 8010:80 restart: always backend: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: python manage.py runserver 0.0.0.0:8000 ports: - 8011:8000 restart: always celery-worker: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server worker -l info --pool=solo --concurrency=1 depends_on: - redis - backend restart: always celery-beat: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler depends_on: - redis - backend restart: always redis: image: redis:latest ports: - 6379:6379 restart: always mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=sacfxSql258147@ ports: - 8016:3306 volumes: - ./mysql:/var/lib/mysql restart: always frontend:dockerfile文件 FROM node:16.18.1 WORKDIR /app/frontend COPY package*.json ./ RUN npm install COPY . . RUN npm run build:prod FROM nginx:latest COPY --from=0 /app/frontend/dist/ /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
07-14
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值