【实战:Django-Celery-Flower实现异步和定时爬虫及其监控邮件告警】

news2024/11/16 11:34:35

1 Django中集成方式一(通用方案)

1.1 把上面的包-复制到djagno项目中

在这里插入图片描述

1.2 在views中编写视图函数

1.3 配置路由

1.4 浏览器访问,提交任务

1.5 启动worker执行任务

1.6 查看任务结果


2 Django中集成方式二(官方方案)

2.0 安装模块

pip installDjango==3.2.22
pip install celery
pip install redis
pip install eventlet  #在windows环境下需要安装eventlet包
-----------
pip install django-celery-beat
pip install django-celery-results
pip install django-simpleui

2.1 在项目目录下新建celery.py

import os
import django
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_demo.settings')
django.setup()
# broker = 'redis://127.0.0.1:6379/1'
# backend = 'redis://127.0.0.1:6379/2'
# app = Celery('celery_demo',broker=broker, backend=backend)


app = Celery('celery_demo')
# app.conf.update(
#     BROKER_URL='redis://127.0.0.1:6379/1',
#     # BACKEND配置,使用redis
#     CELERY_RESULT_BACKEND='redis://127.0.0.1:6379/2',
#     CELERY_ACCEPT_CONTENT=['json'],
#     CELERY_TASK_SERIALIZER='json',
#     # 结果序列化方案
#     CELERY_RESULT_SERIALIZER='json',
#     # 任务结果过期时间,秒
#     CELERY_TASK_RESULT_EXPIRES=60 * 60 * 24,
#     # 时区配置
#     CELERY_TIMEZONE='Asia/Shanghai',
# )

app.config_from_object('django.conf:settings')

app.autodiscover_tasks()
# app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


在这里插入图片描述

2.2 在django配置文件中加入

# celery 配置
###----Celery redis 配置-----###
# Broker配置,使用Redis作为消息中间件
BROKER_URL = 'redis://127.0.0.1:6379/1'
# BACKEND配置,使用redis
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
# 结果序列化方案
CELERY_RESULT_SERIALIZER = 'json'
# 任务结果过期时间,秒
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
# 时区配置
CELERY_TIMEZONE = 'Asia/Shanghai'

在这里插入图片描述

2.3 在主目录的__init__.py中添加如下代码

from .celery import app as celery_app

__all__ = ('celery_app',)

在这里插入图片描述

2.4 在app下新建tasks.py(必须叫tasks.py)

from celery import shared_task
import time


@shared_task()
def add():
    time.sleep(1)
    print('结果是')
    return 10


@shared_task()
def send_email(mail):
    time.sleep(1)
    print(f'给{mail}发送邮件了')
    return '成功'

在这里插入图片描述

2.5 实现异步views.py

from django.shortcuts import render,HttpResponse

# Create your views here.

from .tasks import add
def celery_add(request):
    res=add.delay()
    return HttpResponse(res)

在这里插入图片描述

2.6 配置路由

总路由urls.py

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include('app01.urls')),
]

app自己的路由urls.py

from django.contrib import admin
from django.urls import path
from .views import celery_add

urlpatterns = [
    path('celery_demo/', celery_add),
]

2.7 启动celery

celery -A celery_demo worker -l debug -P eventlet

在这里插入图片描述

2.8 浏览器访问-添加任务

http://127.0.0.1:8000/app01/celery_demo/

3 实现定时任务

3.1 settings.py加入

# celery_beat
CELERYBEAT_SCHEDULE = {
    'every_5_seconds': {
        # 任务路径
        'task': 'app01.tasks.add',
        # 每5秒执行一次
        'schedule': 200,
        'args': ()
    },
    # 'every_10_seconds': {
    #     # 任务路径
    #     'task': 'app01.tasks.send_email',
    #     # 每10秒执行一次,task1的参数是5
    #     'schedule': 10,
    #     'args': (['306334678@qq.com'])
    # }
}

3.2 启动worker和beat

celery -A celery_demo worker -l debug -P eventlet
celery -A celery_demo beat -l debug

4 通过Admin配置定时任务

通过settings.py的配置可以实现定时任务的配置,做为实际项目中可能还是不够实用,更加工程化的做法是将定时任务的配置放到数据库里通过界面来配置。
Celery对此也提供了很好的支持,这需要安装django-celery-beat插件

4.1 安装djiango-celery-beat

pip install django-celery-beat

4.2 在APP中注册djiango-celery-beat

INSTALLED_APPS = [
....
'django_celery_beat',
]

4.3 在settings.py中设置调度器及时区

在settings.py中屏蔽到原来的调度器,加入

CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler' 

4.4 设置时区

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = False

4.5 数据库迁移

python manage.py migrate django_celery_beat

4.6 启动woker和beat

#在两个控制台分别启动woker和beta

celery -A celery_demo worker -l debug -P eventlet
celery -A celery_demo beat -l debug

4.7 创建超级用户-访问admin的web管理端

# 1 创建超级用户
python manage.py createsuperuser

# 2 访问admin
http://127.0.0.1:8000/admin/login/

4.8 美化admin

# 1 开源地址
https://gitee.com/tompeppa/simpleui
# 2 文档地址
https://newpanjing.github.io/simpleui_docs/config.html
    
# 3 安装
pip3 install django-simpleui

# 4 配置app
  INSTALLED_APPS = [
      'simpleui',
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      ...
  ]
    
# 5 重新打开admin

在这里插入图片描述

5 admin监控任务执行情况

在控制台监控任务执行情况,还不是很方便,最好是能够通过web界面看到任务的执行情况,如有多少任务在执行,有多少任务执行失败了等。
这个Celery也是可以做到了,就是将任务执行结果写到数据库中,通过web界面显示出来。
这里要用到django-celery-results插件。
通过插件可以使用Django的orm作为结果存储,这样的好处在于我们可以直接通过django的数据查看到任务状态,同时为可以制定更多的操作

5.1 安装django-celery-results

pip install django-celery-results

5.2 配置settings.py,注册app

INSTALLED_APPS = (
...,
'django_celery_results',
)

5.3 修改backend配置,将Redis改为django-db

# BACKEND配置,使用redis
#CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'

# 使用使用django orm 作为结果存储
CELERY_RESULT_BACKEND = 'django-db'  #使用django orm 作为结果存储

5.4 迁移数据库

python manage.py migrate django_celery_results
# 可以看到创建了django_celery_results相关的表

5.5 admin 查看

在这里插入图片描述

6 Flower监控任务执行情况

如果不想通django的管理界面监控任务的执行,还可以通过Flower插件来进行任务的监控。Flower的界面更加丰富,可以监控的信息更全

Flower 是一个用于监控和管理 Celery 集群的开源 Web 应用程序。它提供有关 Celery workers 和tasks状态的实时信息

# Flower可以:
1 实时监控celery的Events
    -查看任务进度和历史记录
    -查看任务详细信息(参数、开始时间、运行时间等)

2 远程操作
    -查看workers 状态和统计数据
    -关闭并重新启动workers 实例
    -控制工作池大小和自动缩放设置
    -查看和修改工作实例消耗的队列
    -查看当前正在运行的任务
    -查看计划任务(预计到达时间/倒计时)
    -查看保留和撤销的任务
    -应用时间和速率限制
    -撤销或终止任务

3 Broker 监控
	-查看所有 Celery 队列的统计信息

6.1 安装和启动

# 安装
pip install flower

# 启动
# 方式一:
celery -A celery_demo flower --port-5555
#方式二
celery --broker=redis://127.0.0.1:6379/1 flower

        
# 浏览器访问:
http://127.0.0.1:5555/

在这里插入图片描述
在这里插入图片描述

7 任务异常自动告警

虽然可以通过界面来监控了,但是我们想要得更多,人不可能天天盯着界面看吧,如果能实现任务执行失败就自动发邮件告警就好了。这个Celery当然也是没有问题的。
通过钩子程序在异常的时候触发邮件通知

7.1 tasks.py中加入

from celery import shared_task
import time
from celery import Task
from django.core.mail import send_mail
from django.conf import settings
# 成功失败邮件告警
class SendEmailTask(Task):
    def on_success(self, retval, task_id, args, kwargs):
        info = f'任务成功-- 任务id是:{task_id} , 参数是:{args} , 执行成功 !'
        send_mail('celery任务监控成功告警', info, settings.EMAIL_HOST_USER, ["616564099@qq.com",])

        print('------------成功')

    def on_failure(self, exc, task_id, args, kwargs, einfo):
        info = f'任务失败-- 任务id为:{task_id} , 参数为:{args} , 失败 ! 失败信息为: {exc}'
        send_mail('celery任务监控失败告警', info, settings.EMAIL_HOST_USER, ["616564099@qq.com",])
        print('------------失败')

    def on_retry(self, exc, task_id, args, kwargs, einfo):
        print(f'任务id位::{task_id} , 参数为:{args} , 重试了 !  错误信息为: {exc}')


@shared_task(base=SendEmailTask, bind=True)
def add(a,b):
    time.sleep(1)
    return a+b


@shared_task()
def send_email(mail):
    print(f'给{mail}发送邮件了')
    return '成功'






# celery -A celery_demo worker -l debug -P eventlet
# celery -A celery_demo beat -l debug
# celery -A celery_demo flower --port-5566

7.2 重启服务

# celery -A celery_demo worker -l debug -P eventlet

# celery -A celery_demo beat -l debug

7.3 验证效果

在任务成功或失败的时候发邮件通知

在这里插入图片描述

在这里插入图片描述

8 爬取技术文章并告警

8.1 task.py

import requests
from bs4 import BeautifulSoup
from redis import Redis
from app01.models import Article
@shared_task(base=SendEmailTask, bind=True)
def crawl_cnblogs(self):
    # redis 链接
    conn = Redis(host='127.0.0.1', port='6379')
    res = requests.get('https://www.cnblogs.com/')
    soup = BeautifulSoup(res.text, 'html.parser')
    article_list = soup.find_all(name='article', class_='post-item')
    for article in article_list:
        title = article.find(name='a', class_='post-item-title').text
        author = article.find(name='a', class_='post-item-author').span.text
        url = article.find(name='a', class_='post-item-title').attrs.get('href')
        desc = article.find(name='p', class_='post-item-summary').text.strip()
        print(f'''
        文章标题:{title}
        文章作者:{author}
        文章地址:{url}
        文章摘要:{desc}
        ''')
        res = conn.sadd('urls', url)
        if res:
            Article.objects.create(title=title, author=author, url=url, desc=desc)

8.2 models.py

class Article(models.Model):
    title = models.CharField(max_length=64)
    author = models.CharField(max_length=64)
    url = models.CharField(max_length=64)
    desc = models.TextField()

8.3 在admin中添加任务并查看结果

#### 邮箱配置####
EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465
EMAIL_HOST_USER = '306334678@qq.com'  # 帐号
EMAIL_HOST_PASSWORD = 'nbjpdbazeeflbjej'  # 密码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
#这样收到的邮件,收件人处就会这样显示
#DEFAULT_FROM_EMAIL = 'lqz<'306334678@qq.com>'
EMAIL_USE_SSL = True   #使用ssl
#EMAIL_USE_TLS = False # 使用tls

#EMAIL_USE_SSL 和 EMAIL_USE_TLS 是互斥的,即只能有一个为 True

8.4 爬美女图片

import os
# 爬取美女图片
@shared_task(base=SendEmailTask, bind=True)
def crawl_photo(self,url):
    res = requests.get(url)
    res.encoding = 'gbk'
    # print(res.text)
    soup = BeautifulSoup(res.text, 'html.parser')
    ul = soup.find('ul', class_='clearfix')
    img_list = ul.find_all(name='img', src=True)
    for img in img_list:
        try:
            url = img.attrs.get('src')
            if not url.startswith('http'):
                url = 'https://pic.netbian.com' + url
            print(url)
            res1 = requests.get(url)
            name = url.split('-')[-1]
            with open(os.path.join(settings.BASE_DIR,'img',name), 'wb') as f:
                for line in res1.iter_content():
                    f.write(line)
        except Exception as e:
            continue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

25_Vision Transformer原理详解

1.1 简介 Vision Transformer (ViT) 是一种将Transformer架构从自然语言处理(NLP)领域扩展到计算机视觉(CV)领域的革命性模型&#xff0c;由Google的研究人员在2020年提出。ViT的核心在于证明了Transformer架构不仅在处理序列数据&#xff08;如文本&#xff09;方面非常有效&…

探索智能合约在金融科技中的前沿应用与挑战

随着区块链技术的发展和普及&#xff0c;智能合约作为其核心应用之一&#xff0c;在金融科技&#xff08;FinTech&#xff09;领域中展现出了巨大的潜力和挑战。本文将深入探讨智能合约的基本概念、前沿应用案例&#xff0c;以及面临的技术挑战和发展趋势&#xff0c;旨在帮助读…

redis笔记2

redis是用c语言写的,放不频繁更新的数据&#xff08;用户数据。课程数据&#xff09; Redis 中&#xff0c;"穿透"通常指的是缓存穿透&#xff08;Cache Penetration&#xff09;问题&#xff0c;这是指一种恶意或非法请求直接绕过缓存层&#xff0c;直接访问数据库或…

HouseCrafter:平面草稿至3D室内场景的革新之旅

在室内设计、房地产展示和影视布景设计等领域,将平面草稿图快速转换为立体的3D场景一直是一个迫切的需求。HouseCrafter,一个创新的AI室内设计方案,正致力于解决这一挑战。本文将探索HouseCrafter如何将这一过程自动化并提升至新的高度。 一、定位:AI室内设计的革新者 Ho…

通过MATLAB控制TI毫米波雷达的工作状态之TLV数据解析及绘制

前言 前一章博主介绍了如何基于设计视图中的这些组件结合MATLAB代码来实现TI毫米波雷达数据的实时采集。这一章将在此基础上实现TI毫米波雷达的TLV数据解析。过程中部分算法会涉及到一些简单的毫米波雷达相关算法,需要各位有一定的毫米波雷达基础。 TLV数据之协议解析 紧着…

爬虫学习 | 01 Web Scraper的使用

目录 背景介绍&#xff1a; 第一部分&#xff1a;Web Scraper简介 1.什么是Web Scraper&#xff1a; Web Scraper&#x1f6d2; 主要用途&#xff1a; 2.为什么选择Web Scraper&#xff1a; 第二部分&#xff1a;安装Web Scraper ​​​​​1.打开google浏览器&#xf…

实验六:频域图像增强方法

一、实验目的 熟练掌握频域滤波增强的各类滤波器的原理及实现。分析不同用途的滤波器对频域滤波增强效果的影响,并分析不同的滤波器截止频率对频域滤波增强效果的影响。二、实验原理 ① Butterworth 低通滤波器:一种具有最大平坦通带幅度响应的滤波器。它的特点是在通带内具…

WPF实现一个带旋转动画的菜单栏

WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目&#xff0c;如下所示 2、创建文件夹及文件 创建资源文件夹&…

redis讲解与介绍

Redis介绍&#xff1a; Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构&#xff0c;如 字符串&#xff08;strings&#xff09;&#xff0c; 散列&#x…

linux adb命令

⏩ 大家好哇&#xff01;我是小光&#xff0c;正在努力寻找自己的职业方向。 ⏩ 在调试设备时&#xff0c;经常会用到adb命令&#xff0c;本文对linux adb命令做一个知识分享。 ⏩ 感谢你的阅读&#xff0c;不对的地方欢迎指正。 1.adb命令 即 Android Debug Bridge 是一种允许…

从产品手册用户心理学分析到程序可用性与易用性的重要区别

注&#xff1a;机翻&#xff0c;未校对。 Designing for People Who Have Better Things To Do With Their Lives 为那些生活中有更重要事情要做的人设计 When you design user interfaces, it’s a good idea to keep two principles in mind: 在设计用户界面时&#xff0c;…

数据库:编程(打开、操作(增、删、改、查)、关闭)

一、需要的头文件 sqlite3.h 二、编译过程 gcc xxx -lsqlite3 三、编程框架 打开数据库 》读写数据库(增&#xff0c;删&#xff0c;改&#xff0c;查) 》关闭数据库 3.1 打开数据库&#xff1a; sqlite3_open int sqlite3_open(char * path,sqlite3 ** db); 功能&…

docker持久化

上周学习了docker的dockerfile&#xff0c;这周会往下学习一下docker的持久化&#xff1b;提到持久化&#xff0c;首先会涉及到一个UnionFS的概念&#xff1b; 1、什么是UnionFS? docker创建镜像的时候&#xff0c;会将各种依赖包括操作系统OS、工具包、依赖库等都放在文件系…

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足以下三种 一致性&#xff08;C:consistency&#xff09;可用性&#xff08;A:Available&#xff09;分区容错性&#xff08;P:Partition Tolerance&#xff09; 这三个基本要求&#xff0c;最多只能同时满足…

内容长度不同的div如何自动对齐展示

平时我们经常会遇到页面内容div结构相同页&#xff0c;这时为了美观我们会希望div会对齐展示&#xff0c;但当div里的文字长度不一时又不想写固定高度&#xff0c;就会出现div长度长长短短&#xff0c;此时实现样式可以这样写&#xff1a; .e-commerce-Wrap {display: flex;fle…

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 事件传参 &#xff08;以下为错误示例&#xff09; 3.事件传参与数据同步 4.条件渲染 …

人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解。 文章目录 一、引言二、梯度问题1. 梯度爆炸梯度爆炸的概念梯度爆炸的原因梯度爆炸的解决方案 2. 梯度消失梯度消失的概念梯度…

十九、【文本编辑器(五)】排版功能

目录 一、搭建框架 二、实现段落对齐 三、实现文本排序 一、搭建框架 (1) 在imgprocessor.h文件中添加private变量&#xff1a; QLabel *listLabel; //排序设置项QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *…

实践致知第16享:设置Word中某一页横着的效果及操作

一、背景需求 小姑电话说&#xff1a;现在有个word文档,里面有个表格太长&#xff08;如下图所示&#xff09;&#xff0c;希望这一个设置成横的&#xff0c;其余页还是保持竖的&#xff01; 二、解决方案 1、将鼠标放置在该页的最前面闪烁&#xff0c;然后选择“页面”》“↘…

Macbook pro插移动硬盘没反应,Macbook pro移动硬盘读不了怎么办 macbook插移动硬盘后无法使用

为了弥补Macbook pro硬盘容量的缺失&#xff0c;我们有时候会使用到外接硬盘或移动硬盘。一般来说&#xff0c;这些硬盘都是即插即用的&#xff0c;可能部分要安装插件。不过&#xff0c;在一些特殊情况下&#xff0c;也会遇到插硬盘没反应等问题。本文会给大家解答Macbook pro…