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