【问题标题】:Workflow frameworks for Django [closed]Django的工作流框架[关闭]
【发布时间】:2011-10-11 08:09:41
【问题描述】:

我一直在寻找一个框架来简化 Django 应用程序中相当复杂的工作流的开发。我希望能够使用该框架来自动执行状态转换、权限以及一些额外的操作,例如审计日志和通知。

我看过一些关于同一主题的较早信息,但在过去 2-3 年中并没有太多。我听说的主要选择是 GoFlow(自 2/2009 以来未更新)和 django-workflow(似乎更活跃)。

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

【问题讨论】:

    标签: django workflow


    【解决方案1】:

    我在这里做几点说明,因为我是 django-fsm 和 django-viewflow 的作者,这两个项目可以称为“工作流库”。

    工作流这个词本身有点被高估了。不同类型的库和软件可以称自己为“工作流程”,但具有不同的功能。 共同点是工作流将某个流程的步骤连接成一个整体。

    一般分类

    在我看来,工作流实现方法可以分为以下几类:

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

    其中,前两个可以被认为是渐进的差异,但其他两个是根本性的。

    具体包

    这里是我们现在在工作流部分下的 django、djangopackages 和 awesome-django project list 中的简要说明:

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

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

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

    • GoFlow,在问题中提到,往往是显式、多用户、并行、动态工作流,但它已被作者放弃年。

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

    希望,如果任何人能够阅读迄今为止,现在更好地理解工作流术语,并且可以为他们的项目有意识地选择工作流库。

    【讨论】:

    • 我需要在我正在构建的 Django 应用程序中使用动态工作流。这个答案是最新的还是过去 3 年的情况发生了变化?
    • “awesome-django 项目列表”链接已损坏。镜子可以在kupleron/awesome-django找到。
    【解决方案2】:

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

    是的。

    Python。

    您不需要工作流产品来自动执行状态转换、许可,也许还有一些额外的东西,比如审计日志和通知。

    这样做的项目不多是有原因的。

    • State 设计模式很容易实现。

    • 授权规则(“许可”)已经是一流的 Django 的一部分。

    • 日志记录已经是 Python 的一流部分(并且已经 添加到 Django 中)。将其用于审计日志记录要么是审计 表或其他记录器(或两者)。

    • 消息框架(“通知”)已经是 Django 的一部分。

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

    使用 State 设计模式的类定义,以及用于授权和日志记录的装饰器效果非常好,以至于您不需要任何超出已有的东西。

    阅读此相关问题:Implementing a "rules engine" in Python

    【讨论】:

    • 确实,我不需要框架来实现工作流,因此,我不需要框架来开发 Web 应用程序。但是,如果有一个解决方案可以让我抽象出特别丰富的工作流程中的常见元素,我很乐意找到它。
    • @mcoconnor:“抽象出共同的元素”。我以为我提供了清单。你想要的大部分已经在 Django 中了。唯一缺少的是 State 设计模式。 Django 怎么了?
    • 当我尝试自己实现一些工作流程时,我发现我真正需要的是一个工作的端到端管理应用程序,而不是一种表达状态的好方法。
    【解决方案3】:

    这很有趣,因为我会同意 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}}""")
    

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

    这样的工具

    【讨论】:

      【解决方案4】:

      我的同事django-fsm 编写的一个包似乎可以工作——它既相当轻量级又足够实用。

      【讨论】:

        【解决方案5】:

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

        django-river

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

        【讨论】:

          【解决方案6】:

          ActivFlow:通用、轻量级和可扩展的工作流引擎,用于复杂业务流程操作的敏捷开发和自动化。

          您可以立即对整个工作流程进行建模!

          第 1 步:工作流应用注册

          WORKFLOW_APPS = ['leave_request']
          

          第 2 步:活动配置

          from activflow.core.models import AbstractActivity, AbstractInitialActivity
          from activflow.leave_request.validators import validate_initial_cap
          
          class RequestInitiation(AbstractInitialActivity):
              """Leave request details"""
              employee_name = CharField(
                  "Employee", max_length=200, validators=[validate_initial_cap])
              from = DateField("From Date")
              to = DateField("To Date")
              reason = TextField("Purpose of Leave", blank=True)
          
              def clean(self):
                  """Custom validation logic should go here"""
                  pass
          
          class ManagementApproval(AbstractActivity):
              """Management approval"""
              approval_status = CharField(verbose_name="Status", max_length=3, choices=(
                  ('APP', 'Approved'), ('REJ', 'Rejected')))
              remarks = TextField("Remarks")
          
              def clean(self):
                  """Custom validation logic should go here"""
                  pass
          

          第 3 步:流定义

          FLOW = {
          'initiate_request': {
              'name': 'Leave Request Initiation',
              'model': RequestInitiation,
              'role': 'Submitter',
              'transitions': {
                  'management_approval': validate_request,
              }
          },
          'management_approval': {
              'name': 'Management Approval',
              'model': ManagementApproval,
              'role': 'Approver',
              'transitions': None
              }
          }
          

          第 4 步:业务规则

          def validate_request(self):
              return self.reason == 'Emergency'
          

          【讨论】:

          • 我用 pip 找不到它
          【解决方案7】:

          我将 django-goflow 从 django 1.X -python 2.X 迁移到适合 django 2.X - python 3.x,项目位于 django2-goflow

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-30
            • 1970-01-01
            • 2012-11-18
            相关资源
            最近更新 更多