结合使用Celery和Django进行后台任务处理

Web应用程序通常一开始就很简单,但可能会变得非常复杂,并且大多数Web应用程序很快超出了仅响应HTTP请求的职责。

发生这种情况时,必须区分必须立即发生的情况(通常在HTTP请求生命周期中)和最终可能发生的情况。 这是为什么? 好吧,因为当您的应用程序流量超载时,像这样的简单事情就会有所作为。

Web应用程序中的操作可以分为关键操作或请求时间操作以及后台任务,这些操作发生在请求时间之外。 这些映射到上述内容:

  • 需要立即发生:请求时操作
  • 最终需要发生:后台任务

可以在单个请求/响应周期上完成请求时操作,而不必担心操作会超时或用户可能体验不好。 常见示例包括CRUD(创建,读取,更新,删除)数据库操作和用户管理(登录/注销例程)。

后台任务是不同的,因为它们通常很耗时并且容易失败,主要是由于外部依赖性。 复杂的Web应用程序中的一些常见方案包括:

  • 发送确认或活动电子邮件
  • 每天从各种来源抓取和抓取一些信息并将其存储
  • 进行数据分析
  • 删除不需要的资源
  • 导出各种格式的文档/照片

后台任务是本教程的主要重点。 这种情况下最常用的编程模式是生产者使用者体系结构。

简单来说,这种架构可以这样描述:

  • 生产者创建数据或任务。
  • 任务被放入一个称为任务队列的队列中。
  • 消费者负责使用数据或运行任务。

通常,使用者以先进先出(FIFO)的方式或根据他们的优先级从队列中检索任务。 消费者也称为工人,这就是我们将在整个过程中使用的术语,因为它与所讨论的技术所使用的术语一致。

可以在后台处理哪些任务? 任务:

  • 对于Web应用程序的基本功能不是必需的
  • 由于它们很慢(I / O密集等),因此无法在请求/响应周期中运行
  • 取决于可能不可用或表现不正常的外部资源
  • 可能需要至少重试一次
  • 必须按计划执行

Celery是在Python / Django生态系统中执行后台任务处理的事实选择。 它具有简单明了的API,并且与Django完美集成。 它支持用于任务队列的各种技术和用于工人的各种范例。

在本教程中,我们将创建一个使用后台任务处理的Django玩具Web应用程序(处理实际场景)。

设置事情

假设您已经熟悉Python软件包管理和虚拟环境,那么让我们安装Django:

$ pip install Django

我已决定构建另一个博客应用程序。 该应用程序的重点将放在简单性上。 用户可以简单地创建一个帐户,而不必大惊小怪地创建一个帖子并将其发布到平台上。

设置quick_publisher Django项目:

$ django-admin startproject quick_publisher

让我们开始应用程序:

$ cd quick_publisher 
$ ./manage.py startapp main

当启动一个新的Django项目时,我喜欢创建一个main应用程序,其中包含一个自定义用户模型。 我经常遇到默认Django User模型的限制。 拥有自定义的User模型可为我们带来灵活性的好处。

# main/models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager


class UserAccountManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError('Email address must be provided')

        if not password:
            raise ValueError('Password must be provided')

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email=None, password=None, **extra_fields):
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields['is_staff'] = True
        extra_fields['is_superuser'] = True

        return self._create_user(email, password, **extra_fields)


class User(AbstractBaseUser, PermissionsMixin):

    REQUIRED_FIELDS = []
    USERNAME_FIELD = 'email'

    objects = UserAccountManager()

    email = models.EmailField('email', unique=True, blank=False, null=False)
    full_name = models.CharField('full name', blank=True, null=True, max_length=400)
    is_staff = models.BooleanField('staff status', default=False)
    is_active = models.BooleanField('active', default=True)

    def get_short_name(self):
        return self.email

    def get_full_name(self):
        return self.email

    def __unicode__(self):
        return self.email

如果您不熟悉自定义用户模型的工作方式,请确保查看Django 文档

现在,我们需要告诉Django使用此User模型而不是默认模型。 将此行添加到quick_publisher/settings.py文件中:

AUTH_USER_MODEL = 'main.User'

我们还需要将main应用程序添加到quick_publisher/settings.py文件中的INSTALLED_APPS列表中。 现在,我们可以创建迁移,应用迁移并创建超级用户,以能够登录Django管理面板:

$ ./manage.py makemigrations main 
$ ./manage.py mig
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值