”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在 Django 中使用 SQLite 作为 Celery 代理

在 Django 中使用 SQLite 作为 Celery 代理

发布于2024-08-18
浏览:203

Use SQLite as a Celery broker in Django

Redis 和 RabbitMQ 可能是使用 Celery 时的首选代理,但是当您在本地开发时,它们可能会让人觉得大材小用。 Celery 5.4 的文档提到您可以使用 SQLite 作为本地开发的实验代理。然而,当您导航到 Celery 的后端和代理页面时,唯一提到的 SQL 是针对 SQLAlchemy 后端。值得庆幸的是,该页面指出,“本节并未全面介绍后端和代理。”

这篇文章将向您展示如何在 Django 项目中为 Celery 实现 SQLite 代理(或任何 SQL!)。这篇文章不会教你使用 Celery:查看 Celery 官方文档。

在我们开始之前

出于本文的目的,我们假设您已经有一个现有的 Django 项目,并且使用 Celery 官方“Django 的第一步”指南中的步骤安装了 Celery。 Celery 后端不是必需的,但您可能需要按照指南的步骤安装和配置 django-celery-results。如果您不清楚 backendsbrokers 之间的区别,请查看我的文章“了解 Celery 中的任务、brokers、workers 和后端”。

除非另有明确说明,所有源文档链接均适用于发布时(2024 年 7 月)当前版本的 Django、Celery 和 SQLAlchemy。如果您在遥远的将来阅读本文,事情可能会发生变化。

设置 SQL 代理

虽然 Celery 管理任务和队列,但它委托给另一个名为 Kombu 的库来与代理交换消息。 RabbitMQ 和 Redis 是 Kombu 功能最齐全的传输(代理),但它还具有适用于 Amazon SQS、ZooKeeper 和 MongoDB 的虚拟传输。

在 Kombu 文档的最角落里,有一个支持 PostgreSQL、MySQL 和 SQLite 的 SQLAlchemy 传输模型。曾几何时,SQLAlchemy 代理甚至记录在 Celery 的网站上,但此后它已从库的新版本的文档中删除。尽管如此,它仍然足以满足当地的发展。

要在 Django 应用程序中使用后续数据库作为 Celery 代理,请首先安装 SQLAlchemy:

pip install SQLAlchemy

在 Django 项目的 settings.py 文件中,您可以使用 CELERY_BROKER_URL 设置来设置代理的后端:

# BASE_DIR is the directory of your project's main directory.

CELERY_BROKER_URL = f"sqlalchemy sqlite:////{BASE_DIR}/broker.sqlite3"

SQLAlchemy 代理 URL 由 3 部分组成:

  1. 字符串 sqlalchemy 或 sqla(它们可以互换)
  2. 一个标志
  3. SQLAlchemy 连接字符串

Mac/Unix 和 Windows 上的 SQLite 连接字符串不同:

# MacOS/Unix
CELERY_BROKER_URL = "sqla sqlite:////your/project/path/broker.sqlite3"

# Windows
CELERY_BROKER_URL = "sqla sqlite:///C:your\\project\\path\\broker.sqlite3"

您还可以使用 Postgres 作为 Celery 代理,或者您也可以轻松使用 MySQL 作为 Celery 代理:

# MySQL
CELERY_BROKER_URL = "sqlalchemy mysql://scott:tiger@localhost/foo"

# PostgreSQL
CELERY_BROKER_URL = "sqla postgresql://scott:tiger@localhost/mydatabase"

# PosgreSQL connecting using pg8000
CELERY_BROKER_URL = "sqla postgresql pg8000://scott:tiger@localhost/mydatabase"

您可能需要安装其他库来连接 MySQL 或 PostgreSQL,您安装的库可能会影响 SQLAlchemy 连接字符串。检查 SQLAlchemy 数据库 URL 文档以获取更多详细信息。

无论您选择哪个数据库,您都可能需要考虑将代理 URL 存储在环境变量中,以便在不同环境中轻松更改:

CELERY_BROKER_URL = os.getenv("CELERY_BROKER_URL")

一句警告

SQLAlchemy 传输可能被认为是实验性的,因此它不适合生产使用。可能会发生数据丢失,或者消息可能会被多次传送。考虑切换到 Celery 的经纪商和后端页面上列出的更强大的经纪商。

也就是说,这可能适合当地发展,甚至小型副项目。但如果将来无法使用 SQLAlchemy 作为代理,我也不会感到震惊。

后续步骤

随着 Celery 在本地运行,您可以开始开发队列驱动的应用程序。然而,您可能会发现它缺乏自动重新加载是一个摩擦点。如果您想在 Django 应用程序中设置自动 Celery 重新加载,请阅读我的文章“使用自定义 Django 命令自动重新加载 Celery 工作线程。”

版本声明 本文转载于:https://dev.to/tylerlwsmith/use-sqlite-as-a-celery-broker-in-django-1jne?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    在Java 中,以全屏幕独立模式运行Java应用程序时,通常无法按期望的工作可能无法使用JAVA应用程序时,将用户输入在Java ProblemPassive rendering mode allows the use of KeyListener and ActionListener inter...
    编程 发布于2025-06-08
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-06-08
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-06-08
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-06-08
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&华仪的函数时,在接受成员函数指针的函数时,要在函数上既要提供指针又可以提供指针和指针到函数的函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此...
    编程 发布于2025-06-08
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-06-08
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-06-08
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-06-08
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 的 ...
    编程 发布于2025-06-08
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-06-08
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-06-08
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-06-08
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-06-08
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-06-08
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-06-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3