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 filepathimport pymysqlpymysql.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.pyfrom getsection.views import indexurlpatterns = [path('admin/', admin.site.urls),path('', index),
]# getsection/views.pyfrom django.shortcuts import HttpResponsedef 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.pyfrom __future__ import absolute_import, unicode_literals
from celery import Celery
import osos.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__.pyfrom __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
import pymysql__all__ = ['celery_app']
pymysql.install_as_MySQLdb()# getfiction/settings.pyINSTALLED_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__.py88 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.pyfrom django.shortcuts import HttpResponse
from getfiction.settings import logger
from getsection.tasks import getfictioninfo
from playwright.sync_api import sync_playwrightdef 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.pyfrom __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
存在的问题,版本存在不兼容的问题,尚需优化
相关文章:

django celery 异步任务 异步存储
环境:win11、python 3.9.2、django 4.2.11、celery 4.4.7、MySQL 8.1、redis 3.0 背景:基于django框架的大量任务实现,并且需要保存数据库 时间:20240409 说明:异步爬取小说,并将其保存到数据库 1、创建…...
apex0.1版本安装踩坑指南
踩了无数坑,发现只需要三行命令就可以成功安装apex0.1. 由于pip命令下只能找到0.9的版本,所以需要git clone的方式安装。 1. git clone https://www.github.com/nvidia/apex 这个命令的意思是下载apex到本地。注意,这里需要稳定的环境…...
HTML — 弹性布局(2)
弹性布局的其他属性 1. order 决定弹性项目(flex item)的排列顺序,使用较少,默认为0 。 order 的值可以为任意整数(正整数或负整数均可,也可为0),数值越小越排在前面。 2. align-s…...

MYSQL 8.0版本修改用户密码(知道登录密码)和Sqlyog错误码2058一案
今天准备使用sqlyog连接一下我Linux上面的mysql数据库,然后就报如下错误 有一个简单的办法就是修改密码为password就完事!然后我就开始查找如何修改密码! 如果是需要解决Sqlyog错误码2058的话,执行以下命令,但是注意root对应host是不是loca…...

Linux中磁盘管理
一.磁盘管理的概括和简要说明 磁盘空间的管理,使用硬盘三步: (1)分区: (2)安装文件系统格式化 (3)挂载: 硬盘的分类: (1&#x…...

tailwindcss在manoca在线编辑智能感知
推荐一下monaco-tailwindcss库,它实现在monaco-editor网页在线编辑器中对tailwindcss的智能感知提示,在利用tailwindcss实现html效果布局。非常的方便。 生成CSS...

通过本机调试远端路由器非直连路由
实验目的:如图拓扑,通过本机电脑发,telnet调试远程AR4设备。 重点1:通过ospf路由协议配置拓扑网络,知识点:ospf配置路由器协议语法格式,area区域的定义,区域内网络的配置࿰…...

React路由快速入门:Class组件和函数式组件的使用
1. 介绍 在开始学习React路由之前,先了解一下什么是React路由。React Router是一个为React应用程序提供声明式路由的库。它可以帮助您在应用程序中管理不同的URL,并在这些URL上呈现相应的组件。 2. 安装 要在React应用程序中使用React路由,…...

Pytorch数据结构:GPU加速
文章目录 一、GPU加速1. 检查GPU可用性:2. GPU不可用需要具体查看问题3. 指定设备4.将张量和模型转移到GPU5.执行计算:6.将结果转移回CPU 二、转移原理1. 数据和模型的存储2. 数据传输3. 计算执行4. 设备管理5.小结 三、to方法的参数类型 一、GPU加速 .…...

OpenHarmony开发-连接开发板调试应用
在 OpenHarmony 开发过程中,连接开发板进行应用调试是一个关键步骤,只有在真实的硬件环境下,我们才能测试出应用更多的潜在问题,以便后续我们进行优化。本文详细介绍了连接开发板调试 OpenHarmony 应用的操作步骤。 首先…...

RabbitMQ如何保证消息的幂等性???
在RabbitMQ中,保证消费者的幂等性主要依赖于业务设计和实现,而非RabbitMQ本身提供的一种直接功能。 在基于Spring Boot整合RabbitMQ的场景下,要保证消费者的幂等性,通常需要结合业务逻辑设计以及额外的技术手段来实现。以下是一个…...
【QT】Qt Charts的实际使用中的一些小细节完善如:resetZoom、fitInView
在Qt中, 使用 Qt Charts来创建和操作图表,重置图表缩放状态的功能可以通过调整图表视图的缩放比例来实现。Qt Charts中的QChartView提供了相关的方法来控制图表的缩放和平移。 示例代码,以及如何对此功能进行扩展: #include <…...

上位机图像处理和嵌入式模块部署(qmacvisual缺失的颜色检测)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在图像处理当中,对颜色的处理是非常重要的。当然,这要建立在拍摄图片是彩色图片的基础之上。工业上面,虽然是黑…...

macOS制作C/C++ app
C/C制作macOS .app 一、 .app APP其实是一个文件夹结构,只不过mac的界面中让它看起来像一个单独的文件。 在shell终端或者右键查看包结构即可看到APP的目录结构。 通常的app目录结构如下: _CodeSignature, CodeResources 一般为Mac APP Store上架程序…...
学习笔记——C语言基本概念链表——(12)
在介绍链表之前先介绍一下数据结构的分类: 线性结构:数组,链表,栈,队列 顺序结构:数组 链式结构:链表 非线性结构:树,二叉树 1、链表 特点:利用碎片化空…...
开发环境解决跨域问题
跨域 为什么? 浏览器的同源策略(协议,域名,端口必须相等) http://localhost:9528/ (前端页面) ---------------------》后端接口(https://heimahr.itheima.net/api) 后端没有开启CORS 在后端没有开启CO…...

物理服务器与云服务器的租用对比
物理服务器:每个基于 Web 的应用程序都依赖于一个服务器,该服务器提供网络中的数据存储,并可根据请求提供给客户端。例如,用户使用浏览器访问 Web 应用程序。服务器可确保托管客户端可以使用该硬件组件。与其他托管可能性相比&…...
Ubuntu Desktop Server - Resource temporarily unavailable
Ubuntu Desktop Server - Resource temporarily unavailable 1. 问题2. 解决方案References 1. 问题 foreverstrongubuntu:~$ sudo apt-get install libatlas-base-dev [sudo] password for foreverstrong: E: Could not get lock /var/lib/dpkg/lock - open (11: Resource t…...

用Wireshark工具对gRPC接口进行本地抓包
前言: 本人一名敲代码的程序员,突然领导安排研究gRPC接口,并且抓包分析, 抓包工具试了Charles、mitmproxy都不行,浪费很多时间,最后使用Wireshark工具对本地启动的gRPC接口成功抓包,关于安装W…...

科技动态人工智能应用太空探索生物科技
根据最新的科技资讯,以下是一些值得关注的科技动态: 人工智能领域 智能体热潮 :随着大模型的研发热潮,AI智能体的发展迅速,它们被用作认知核心,具备强大的学习和迁移能力。智能体的架构和交互方式也在不断进…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...