django celery 异步任务 异步存储

环境:win11、python 3.9.2、django 4.2.11、celery 4.4.7、MySQL 8.1、redis 3.0

背景:基于django框架的大量任务实现,并且需要保存数据库

时间:20240409

说明:异步爬取小说,并将其保存到数据库

1、创建django项目,并创建app,测试调通

# 创建目录GetFiction
pip install django==4.2.11 pymysql-1.1.0
django-admin startproject getfiction .
django-admin startapp getsection

配置MySQL连接、应用注册、日志、其他配置

# getfiction/__init__.py  filepath

import pymysql

pymysql.install_as_MySQLdb()

# getfiction/settings.py  filepath

# 数据库连接

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'fictions',
        'USER': '****',
        'PASSWORD': '****',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

# 应用注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'getsection',
]

# 其他配置

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

# 日志配置

import logging

# 创建日志器
logger = logging.getLogger("test")
# 为日志器设置日志等级,如果这里不设置,将会使用其父级日志器的等日志等级
# 这里它的父日志器是root,root的默认日志级别是 logging.WARNING
logger.setLevel(logging.INFO)

# 创建文件处理程序
fh = logging.FileHandler(filename="./test.log",encoding="utf8")
# 创建流处理程序
sh = logging.StreamHandler()

# 为文件处理程序设置日志等级
fh.setLevel(logging.ERROR)
# 为流处理程序设置日志等级
sh.setLevel(logging.DEBUG)

# 创建格式化程序
ffmt = logging.Formatter(
    fmt = "%(asctime)s - %(levelname)s - %(name)s - %(filename)s:%(lineno)d - %(message)s",
    datefmt = "%Y/%m/%d %H:%M:%S"
)
# 创建格式化程序
sfmt = logging.Formatter(
    fmt = "%(asctime)s - %(levelname)s - %(name)s - %(filename)s:%(lineno)d - %(message)s",
)

# 将 ffmt 格式化程序应用到 fh 文件处理程序
fh.setFormatter(ffmt)
# 将 sfmt 格式化程序应用到 sh 流处理程序
sh.setFormatter(sfmt)

# 将文件处理程序应用到logger日志器
logger.addHandler(fh)
# 将流处理程序应用到logger日志器
logger.addHandler(sh)

 配置首页的路由以及视图函数

# getfiction/urls.py

from getsection.views import index

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

# getsection/views.py

from django.shortcuts import HttpResponse

def index(request):
    # 测试首页
    return HttpResponse(str("hello"))

调试(postman或是浏览器都行)

python manage.py runserver 0.0.0.0:8000

postman测试结果,如下:

2、django中集成celery,异步处理任务,并将任务存储到MySQL

celery配置:broker使用redis,backend使用django自带的ORM,并注册celery相关应用

# getfiction/celery.py

from __future__ import absolute_import, unicode_literals
from celery import Celery
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'getfiction.settings')  # 设置django环境
app = Celery('djcelery', broker='redis://127.0.0.1:6379/0', backend='django-db')
app.autodiscover_tasks()  # 发现任务文件每个app下的task.py

# getfiction/__init__.py

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
import pymysql

__all__ = ['celery_app']
pymysql.install_as_MySQLdb()

# getfiction/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_celery_results',
    'getsection',
    'djcelery',
]

安装redis并启动:Release 3.0.504 · microsoftarchive/redis (github.com)

安装redis、eventlet模块:pip install redis eventlet

 安装celery相关模块

pip install celery django-celery django-celery-results

启动测试报错:

        1、cannot import name 'ugettext_lazy' from 'django.utils.translation'

        “ugettext_lazy”已被 Django 3+ 弃用,所以需要修改django的源码,如下:

        

 将ugettext_lazy使用gettext_lazy替代,修改如下:

# from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _

重启项目,继续测试

        2、ModuleNotFoundError: No module named 'celery.five'

        版本不兼容,将celery的版本降到 4.4.7

pip install celery==4.4.7

重启项目,继续测试

        3、cannot import name 'force_unicode' from 'django.utils.encoding'

处理方式同上述1, 将 force_unicode替换为 force_str

# from django.utils.encoding import force_unicode as force_text  # noqa
from django.utils.encoding import force_str as force_text  # noqa

重启继续

        4、except self._encode_error, exc:

        anyjson不兼容python3,所以产生报错,下面会连续修改该模块相关源码,如下:

        

# GetFiction\venv\lib\site-packages\anyjson\__init__.py
    
88    except self._encode_error as exc:
89            raise (TypeError, TypeError(*exc.args), sys.exc_info()[2])

100   except self._decode_error as exc:
101           raise (ValueError, ValueError(*exc.args), sys.exc_info()[2])

120   print("Running anyjson as a stand alone script is not supported")

67    if isinstance(modinfo["encerror"], str):
69    if isinstance(modinfo["encerror"], str):

         5、from django.utils.translation import ugettext_lazy as _  错误同 1,

        6、from django.utils.translation import ungettext, ugettext as _ 与1类似

        

from django.utils.translation import gettext, gettext as _
# from django.utils.translation import ungettext, ugettext as _

        7、cannot import name 'force_unicode' from 'django.utils.encoding'

# venv/Lib/site-packages/djcelery/admin.py
from django.utils.encoding import force_str as force_text  # noqa

至此,修改源码部分完成

3、添加任务,执行,写入到数据库

 数据库迁移

python manage.py makemigrations   #生成迁移文件
python manage.py migrate          #执行迁移,生成数据表

创建发送任务视图函数:

# getsection/views.py

from django.shortcuts import HttpResponse
from getfiction.settings import logger
from getsection.tasks import getfictioninfo
from playwright.sync_api import sync_playwright


def index(request):
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        base_url = "https://www.83ks.org"
        # https://www.83ks.org/read/196719/2535054.html 某一章的内容
        page.goto(f"{base_url}/book/196719/")
        element_href = page.query_selector_all("#list dl a")
        novel_href_dic = {}
        if element_href:
            for i in element_href[:5]:
                c = [i.get_attribute('href')] + i.get_attribute('title').split(" ")[:0:-1]
                if len(c) < 3:
                    logger.error(str(c) + "该章节存在错误")
                elif len(c) == 4:
                    c.remove("lwxs.com")
                    novel_href_dic[c[-1]] = c[:2]
                else:
                    novel_href_dic[c[-1]] = c[:2]
        browser.close()
    for secindex, url_and_secname in novel_href_dic.items():
        getfictioninfo.delay(secindex, url_and_secname)
    return HttpResponse("OK")

安装playwright模块:pip install playwright

# getsection/tasks.py

from __future__ import absolute_import
from celery import shared_task
from playwright.sync_api import sync_playwright
from getfiction.settings import logger



@shared_task
def getfictioninfo(secindex, url_and_secname):
    # 第68章  ['/read/196719/1660838.html', '势不可挡']
    with sync_playwright() as p:
        browser = p.chromium.launch()
        section_page = browser.new_page()
        section_url = "https://www.83ks.org" + url_and_secname[0]
        try:
            section_page.goto(section_url)
        except Exception as e:
            logger.error(str(secindex) + str(e))
        section_page_element = section_page.query_selector_all("#content p")
        section_name = secindex + " " + url_and_secname[1] + "\n"
        logger.info(section_name)
        for i in section_page_element:
            section_name += i.inner_text() + " "
        return section_name

启动celery:celery -A getfiction worker -l info -P eventlet  

启动django:python manage.py runserver 0.0.0.0:8000

访问首页,进行测试:

数据存储,如下:

 django_celery_results_taskresult

 存在的问题,版本存在不兼容的问题,尚需优化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MAC(M1芯片)编译Java项目慢且发热严重问题解决方案

目录 一、背景二、排查三、解决四、效果以及结果展示五、总结 一、背景 使用idea编译项目等操作&#xff0c;经常性发热严重&#xff0c;并且时间慢。直到昨天编译一个项目用时30分钟&#xff0c;电脑温度很高&#xff0c;并且有烧灼的味道&#xff0c;于是有了此篇文章。 二、…

【网站项目】新冠疫苗预约小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

AI实时换天解决方案:重塑汽车与旅行拍摄新视界

在汽车拍摄与旅行摄影领域&#xff0c;天空作为画面中的重要元素&#xff0c;往往决定着整体视觉效果的成败。美摄科技作为业界领先的AI视觉技术提供商&#xff0c;近日推出了全新的AI实时换天解决方案&#xff0c;为用户带来了前所未有的创意空间与效率提升。 传统的换天技术…

libVLC 提取视频帧使用QGraphicsView渲染

在前面章节中&#xff0c;我们讲解了如何使用QWidget渲染每一帧视频数据&#xff0c;这种方法对 CPU 负荷较高。 libVLC 提取视频帧使用QWidget渲染-CSDN博客 后面又讲解了使用OpenGL渲染每一帧视频数据&#xff0c;使用 OpenGL去绘制&#xff0c;利用 GPU 减轻 CPU 计算负荷…

骑砍2霸主MOD开发(2)-基础开发环境搭建

一.骑砍2霸主程序架构 二.骑砍2霸主C#接口层代码查看 1.C#反编译工具dnspy下载: 2.骑砍2霸主游戏引擎接口查看: 例如IMBAgent interface接口: #调用TaleWorlds.Native.dll中的函数 [EngineMethod("get_movement_flags", false)] uint GetMovementFlags(UIntPtr agen…

【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理

【面试精讲】MyBatis设计模式及源码分析&#xff0c;MyBatis设计模式实现原理 目录 本文导读 一、MyBatis中运用的设计模式详解 1. 工厂模式&#xff08;Factory Pattern&#xff09; 2. 单例模式&#xff08;Singleton Pattern&#xff09; 3. 建造者模式&#xff08;Bu…

Java常见算法_常见的查找算法和排序算法——简介及代码演示

在本文中我将介绍Java中的常见算法&#xff0c;查找算法包括基本查找、二分查找、插值查找和分块查找。排序算法包括冒泡排序、选择排序、插入排序和快速排序 查找算法&#xff1a; 1.基本查找&#xff1a; 代码&#xff1a; public class BasicSearchDemo {public static …

电商技术揭秘十五:数据挖掘与用户行为分析

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

Harmony鸿蒙南向驱动开发-ADC

ADC&#xff08;Analog to Digital Converter&#xff09;&#xff0c;即模拟-数字转换器&#xff0c;可将模拟信号转换成对应的数字信号&#xff0c;便于存储与计算等操作。除电源线和地线之外&#xff0c;ADC只需要1根线与被测量的设备进行连接&#xff0c;其物理连线如图1所…

《前端面试题》- JS基础 - call()、apply()、bind() 的区别

call 、bind 、 apply 这三个函数的功能都是改变this的指向问题&#xff0c;但是也存在一定的区别。 call 的参数是直接放进去的&#xff0c;第二第三第 n 个参数全都用逗号分隔,apply 的所有参数都必须放在一个数组里面传进去bind 除了返回是函数以外&#xff0c;它 的参数和…

Idea中 maven 下载jar出现证书问题

目录 1&#xff1a; 具体错误&#xff1a; 2&#xff1a; 忽略证书代码&#xff1a; 3&#xff1a; 关闭所有idea&#xff0c; 清除缓存&#xff0c; 在下面添加如上忽略证书代码 4&#xff1a;执行 maven clean 然后刷刷新依赖 完成&#xff0c;撒花&#xff01;&#x…

DRF的认证、权限、限流、序列化、反序列化

DRF的认证、权限、限流、序列化、反序列化 一、认证 1、直接用&#xff0c;用户授权 实现方法 编写 ->认证组件 应用组件 编写 ->认证组件 from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationF…

基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1遗传算法与模拟退火算法简介 4.2 GSAHO算法应用于JSSP 5.完整程序 1.程序功能描述 车间作业调度问题&#xff08;Job Shop Scheduling Problem, JSSP&#xff09;是一种典型的生产调度问…

数据仓库的概念和作用?如何搭建数据仓库?

随着企业规模的扩大和数据量的爆炸性增长&#xff0c;有效管理和分析海量数据成为企业数字化转型的关键。而在互联网的普及过程中&#xff0c;信息技术已深入渗透各行业&#xff0c;逐渐融入企业的日常运营。然而&#xff0c;企业在信息化建设中面临了一系列困境和挑战&#xf…

登录压力测试

目录 一、准备测试数据 1.1数据库存储过程添加数据 1.2导出为csv作为测试数据&#xff08;账号、密码&#xff09; 二、使用fiddler抓包查看接口 2.1.抓到相关接口信息 2.2添加线程组和http请求 2.3将前面接口需要的参数去json格式化 ​2.4填写相关信息 ​ 2.5添加http…

gpt科普1 GPT与搜索引擎的对比

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的自然语言处理模型。它通过大规模的无监督学习来预训练模型&#xff0c;在完成这个阶段后&#xff0c;可以用于各种NLP任务&#xff0c;如文本生成、机器翻译、文本分类等。 以下是关…

【网络安全】WebPack源码(前端源码)泄露 + jsmap文件还原

前言 webpack是一个JavaScript应用程序的静态资源打包器。它构建一个依赖关系图&#xff0c;其中包含应用程序需要的每个模块&#xff0c;然后将所有这些模块打包成一个或多个bundle。大部分Vue等项目应用会使用webpack进行打包&#xff0c;使用webpack打包应用程序会在网站js…

集成 LlamaIndex 和 Qdrant 相似性搜索以进行患者记录检索

介绍 由于医疗技术、数字健康记录(EHR)和可穿戴健康设备的进步,医疗领域目前正在经历数据的显着激增。有效管理和分析这些复杂多样的数据的能力对于提供定制医疗保健、推进医学研究和改善患者健康结果至关重要。矢量数据库是专门为高效处理和存储多维数据而定制的,作为一系…

image with CV

""" 视觉&#xff1a;基本API应用&#xff08;OPENCV&#xff09; """ import cv2 import numpy as np"""图像读取方式3. 1.cv2.imread(filename or path, flags)flags0:灰度图像&#xff1b;flags1表示RGB图像&#xff1b;fl…

每日Bug汇总--Day02

Bug汇总—Day02 一、项目运行出错 1、问题&#xff1a;运行SpringBoot项目重新导入Maven报错 org.springframework.boot:spring-boot-dependencies:pom:2.2.2.RELEASE failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failu…