Django的工作流框架

Mic*_*nor 44 django workflow

我一直在寻找一个框架来简化Django应用程序中相当复杂的工作流程的开发.我希望能够使用该框架来自动化状态转换,应用权限,像审计日志记录和通知也许有些演员.

我看过一些关于同一主题的旧信息,但在过去的2 - 3年里并没有太多.我听说过的主要选择是GoFlow(自2009年2月起未更新)和django-workflow(似乎更活跃).

有人用这些包吗?它们是否成熟和/或与现代(1.3)Django兼容?还有其他值得考虑的选择可能会得到更好或更好的支持吗?

kmm*_*vnr 83

我在这里给出一些注释,因为我是django-fsm和django-viewflow的作者,这两个项目可以称为"工作流库".

工作流程本身有点被高估了.不同类型的库和软件可以称自己为"工作流程",但具有不同的功能.通用性是工作流将某个过程的步骤连接成一个整体.

一般分类

如我所见,工作流实施方法可分为以下几类:

  • 单个/多个用户 - 工作流库是自动执行单个用户任务还是具有权限检查/任务分配选项.
  • 顺序/并行 - 顺序工作流只是一种状态机模式实现,允许在某个时刻具有单个活动状态.并行工作流允许同时具有多个活动任务,并且可能具有某种并行同步/加入功能.
  • 显式/隐式 - 工作流是表示为单独的外部实体,还是编织到其他类中,主要责任是不同的.
  • 静态/动态 - 静态工作流在python代码中实现一次然后执行,动态工作流通常可以通过更改工作流数据库表的内容进行配置.静态工作流通常更好地与django基础结构的其余部分(如视图,表单和模板)集成,并通过类继承等常规python构造支持更好的自定义.动态工作流假定您具有可适应任何工作流运行时更改的通用接口.

其中,前两个可以被认为是渐进的差异,但另外两个是基本的.

具体包装

这里简要介绍我们现在在工作流部分下的django,djangopackages和awesome-django项目列表中的内容:

  • django.contrib.WizardView - 隐式,单用户,顺序,静态我们可以拥有的最简单的工作流实现.它将中间状态存储在隐藏形式的后期数据中.
  • django-flows - 显式,单用户,顺序,静态工作流,使流状态保持在外部存储中,允许用户关闭或打开另一个选项卡上的页面并继续工作.
  • django-fsm - 隐式,多用户,顺序,静态工作流 - 最紧凑和轻量级的状态机库.状态更改事件表示为模型类的p​​ython方法调用.对流继承和覆盖有基本的支持.为状态转换提供关联权限的插槽.允许使用乐观锁定来防止并发状态更新.
  • django-states - 显式,多用户,顺序,静态工作流,具有用于状态机和状态转换的单独类.通过将转换的字符串名称传递给make_transition方法进行的转换.提供关联权限与状态转换的方式.有一个简单的REST通用端点,用于使用AJAX调用更改模型状态.文档中未提及状态机继承支持,但类状态定义使得可以在没有或很少核心库修改的情况下实现.
  • django_xworkflows - 显式,顺序,静态工作流,不支持用户权限检查,状态机的分隔类.使用元组用于状态和转换定义,使工作流继承支持变得困难.
  • django-workflows - 显式,多用户,顺序,动态工作流,在库提供的django模型中存储状态.有一种方法可以附加工作流转换的权限,基本上就是这一切.

这些django状态机库都没有支持并行工作流,这大大限制了它们的应用范围.但有两个做:

  • django-viewflow - 显式,多用户,并行,静态工作流,支持并行任务执行,复杂拆分和连接语义.提供帮助程序以与django功能和基于类的视图,不同的后台任务执行查询以及各种悲观和乐观锁定策略集成,以防止并发更新.

  • 提到的GoFlow往往是明确的,多用户,并行,动态的工作流程,但多年来它一直被作者所抛弃.

我看到了在django-viewflow之上实现动态工作流构建功能的方法.一旦完成,将关闭django世界中工作流实施的最后和最复杂的案例.

希望,如果有人能够阅读到目前为止,现在更好地理解工作流程术语,并且可以为他们的项目做有意识的工作流程库选择.

  • 我在构建的Django应用中需要动态工作流程。这个答案是否仍然是最新的?或者在过去三年中情况发生了变化? (2认同)

S.L*_*ott 7

还有其他值得考虑的选择可能会得到更好或更好的支持吗?

是.

蟒蛇.

您不需要工作流产品来自动执行状态转换,权限以及审计日志记录和通知等附加功能.

这就是为什么没有很多项目这样做的原因.

  • 的设计模式是很容易实现.

  • 授权规则("许可")已经是Django的一流部分.

  • 日志记录已经是Python的一流部分(并已添加到Django中).使用它进行审计日志记录可以是审计表,也可以是其他记录器(或两者).

  • 消息框架("通知")已经是Django的一部分.

你还需要什么?你已经拥有了这一切.

使用State设计模式的类定义,以及用于授权和日志记录的装饰器可以很好地工作,以至于您不需要超出您已有的任何东西.

阅读此相关问题:在Python中实现"规则引擎"

  • 确实,我不需要框架来实现工作流,因此,我不需要框架来开发Web应用程序.但是,如果有一个解决方案可以让我在特别丰富的工作流程中抽象出常见元素,我很乐意找到它. (5认同)

Mic*_*nor 5

我的一个合作伙伴django-fsm编写的软件包看起来很有用 - 它既相当轻便又功能强大.


Ada*_*dam 5

这很有趣,因为我会与S.Lott同意只使用Python作为规则引擎。我现在有一个完全不同的观点。

如果您想要一个完整的规则引擎,它需要很多活动部件。我们构建了完整的Python / Django规则引擎,您将惊讶于需要构建什么才能启动并运行出色的规则引擎。我将进一步解释,但首先该网站是http://nebrios.com

规则引擎至少应具有:

  • 访问控制列表 -您是否希望每个人都能看到所有内容?
  • 键/值对API -KVP存储状态,并且所有规则都会对更改后的状态做出反应。
  • 调试模式 -能够查看每个更改的状态,更改的原因以及原因。最重要的。
  • 通过Web表单和电子邮件进行交互-能够快速编写Web表单脚本是一个巨大的优势,并且能够始终解析传入的电子邮件。
  • 流程ID-跟踪业务价值的“线程”。否则,过程将不断重叠。
  • 还有更多!

因此,请试用Nebri或我在下面列出的其他产品,看看它们是否满足您的需求。

这是调试模式

在此处输入图片说明

自动生成的表格

在此处输入图片说明

工作流程规则示例:

class task_sender(NebriOS):
# send a task to the person it got assigned to
listens_to = ['created_date']

def check(self):
    return (self.created_date is not None) and (self.creator_status != "complete") and (self.assigned is not None)

def action(self):
    send_email (self.assigned,"""
        The ""{{task_title}}"" task was just sent your way!

        Once you finish, send this email back to log the following in the system:

        i_am_finished := true

        It will get assigned back to the task creator to look over.

        Thank you!! - The Nebbs
        """, subject="""{{task_title}}""")
Run Code Online (Sandbox Code Playgroud)

因此,不,仅在Python中构建基于规则,基于事件的工作流引擎并不简单。我们已经做了一年多了!我建议使用类似的工具


Ahm*_*DAL 5

我可以再添加一个库,该库支持对工作流组件进行动态更改,这与它的等效项不同。

看看django 河

现在有一个漂亮的管理员叫做River Admin