Cadres de travail pour Django

j'ai cherché un cadre pour simplifier le développement de workflows raisonnablement complexes dans les applications Django. J'aimerais pouvoir utiliser le framework pour automatiser les transitions d'état, la permissioning, et peut-être quelques extras comme la journalisation d'audit et les notifications.

j'ai vu des informations plus anciennes sur le même sujet, mais pas trop au cours des 2-3 dernières années. Les principaux choix dont j'ai entendu parler sont GoFlow (pas mis à jour depuis 2/2009) et django-workflow (semble plus actif).

quelqu'un A utilisé ces paquets? Sont-ils matures et/ou compatibles avec le (1.3) Django moderne? Y a-t-il d'autres options qui valent la peine d'être considérées et qui pourraient être mieux ou mieux soutenues?

35
demandé sur Michael C. O'Connor 2011-07-22 23:51:54

7 réponses

Permettez-moi de donner quelques notes ici que je suis l'auteur de django-fsm et django-viewflow, deux projets qui pourraient être appelés "bibliothèques de flux de travail".

le mot Workflow lui-même est un peu surfait. Différents types de bibliothèques et de logiciels pourraient s'appeler "workflow" mais ont des fonctionnalités variables. Le point commun est qu'un flux de travail relie les étapes d'un processus en un tout.

classification générale

comme je vois, les méthodes de mise en œuvre des flux de travail peuvent être classées comme suit:

  • Single/Multiple users - si workflow library automates single user tasks ou a permission checking/task assignment options.
  • Sequential/Parallel - le flux de travail séquentiel est juste une implémentation de modèle de machine d'état et permet d'avoir un seul état actif à un moment donné. Des travaux parallèles permettent d'avoir plusieurs tâches actives à la fois, et ont probablement une sorte de sync/join fonctionnalité parallèle.
  • explicite/implicite - que le flux de travail soit représenté comme une entité externe distincte, ou qu'il soit tissé dans une autre classe, cette responsabilité principale est différente.
  • Static/Dynamic - les flux de travail statiques sont implémentés en code python une fois et ensuite exécutés, les flux de travail dynamiques peuvent typiquement être configurés par modification du contenu des tables de la base de données workflow. Les flux de travail statiques sont généralement mieux intégrés avec le reste de l'infrastructure de django comme les vues, Les formes et les gabarits, et le soutien de meilleure personnalisation par les constructions habituelles de python comme l'héritage de classe. Les workflows dynamiques supposent que vous avez une interface générique qui peut s'adapter à n'importe quelle modification du workflow runtime.

parmi ceux - ci, les deux premiers peuvent être considérés comme des différences progressives, mais les deux autres sont fondamentaux.

colis spécifiques

voici une brève description de ce que nous avons aujourd'hui à django, djangopackages et impressionnant-liste de projet django sous la section flux de travail:

  • django.contrib.WizardView - implicite, utilisateur unique, séquentielle, statique l'implémentation de flux de travail la plus simple que nous puissions avoir. Il stocke l'état intermédiaire dans le forme cachée post données.
  • django-flows - explicite, utilisateur unique, séquentiel, statique flux de travail, qui maintient l'état de flux dans le stockage externe, pour permettre à l'utilisateur de fermer ou d'ouvrir la page sur un autre onglet et continuer à travailler.
  • django-fsm - implicite, multi-utilisateurs, séquentielle, statique workflow - the most compact and lightweight state machine library. État modifier les événements représentés comme python appels de méthodes de la classe du modèle. A un support rudimentaire pour l'héritage de flux et les dérogations. Fournit des slots pour associer la permission aux transitions d'état. Permet d'utiliser le verrouillage optimiste pour éviter les mises à jour simultanées de l'état.
  • django-states - explicite, multi-utilisateurs, séquentiel , flux de travail statique avec classe séparée pour la machine d'état et les transitions d'état. Transitions par passer le nom de la chaîne de caractères de la transition à la méthode make_transition. Permet d'associer la permission aux transitions d'état. Dispose d'un paramètre générique de repos simple pour changer les États du modèle en utilisant des appels AJAX. État la prise en charge de l'héritage machine n'est pas mentionnée dans la documentation, mais la définition de l'état de classe rend cela possible avec peu ou aucune modification de la bibliothèque principale.
  • django_xworkflows - explicite, séquentiel, statique flux de travail sans prise en charge de la vérification de la permission de l'utilisateur, classe séparée pour la machine d'état. Utilise les tuples pour les définitions d'état et de transition, rend difficile la prise en charge de l'héritage du flux de travail.
  • django-workflows - explicite, multi-utilisateurs, séquentiel, dynamique flux de travail stocker l'état dans la bibliothèque fourni modèles django. A une façon d'attacher la permission à la transition de flux de travail, et essentiellement c'est tout.

aucune de ces bibliothèques de machines de l'état de django ne supporte les flux de travail parallèles, ce qui limite considérablement leur champ d'application. Mais il y en a deux qui le font:

  • django-viewflow - explicite, multi-utilisateurs, parallèle, statique flux de travail, avec le soutien pour l'exécution des tâches en parallèle, la scission complexe et rejoindre semantic. Fournit des aides pour intégrer les vues fonctionnelles et de classe de django, et différentes requêtes d'exécution de tâches de fond, et diverses stratégies de verrouillage pessimistes et optimistes pour empêcher les mises à jour simultanées.

  • GoFlow , mentionné dans la question, tend à être le explicite, multi-utilisateurs, parallèle, dynamique flux de travail, mais il a été abandonné par l'auteur pendant des années.

je vois la façon de mettre en œuvre le flux de travail dynamique fonctionnalité de construction en plus de django-viewflow . Dès qu'il sera terminé, la si clôturera le dernier cas et le plus sophistiqué pour la mise en œuvre de flux de travail dans le monde django.

espérer, si quelqu'un était capable de lire jusqu'à présent, comprend maintenant mieux le terme de flux de travail, et peut faire le choix conscient pour la bibliothèque de flux de travail pour leur projet.

65
répondu kmmbvnr 2017-02-14 04:32:23

y a-t-il d'autres options qui valent la peine d'être considérées et qui pourraient être mieux ou mieux soutenues?

Oui.

Python.

vous n'avez pas besoin d'un produit de flux de travail pour automatiser les transitions d'état, permissioning, et peut-être quelques extras comme la journalisation d'audit et les notifications.

il y a une raison pour laquelle il n'y a pas beaucoup de projets qui font cela.

  • le État modèle de conception est assez facile à mettre en œuvre.

  • les règles D'autorisation ("permissioning") sont déjà une première classe une partie de Django.

  • la journalisation est déjà une partie de première classe de Python (et a été ajouté à Django). Utiliser ceci pour l'enregistrement de l'audit est soit un audit table ou un autre logger (ou les deux).

  • le message framework ("notifications") fait déjà partie de Django.

que vous faut-il de plus? Vous l'avez déjà tous.

utilisant les définitions de classe pour le État motif de conception, et les décorateurs pour l'autorisation et la journalisation fonctionne si bien que vous n'avez pas besoin de quoi que ce soit au-delà de ce que vous avez déjà.

lisez cette question connexe: implémenter un "moteur de règles" en Python

6
répondu S.Lott 2017-05-23 10:31:00

un paquet écrit par un de mes associés, django-fsm , semble fonctionner--il est à la fois assez léger et suffisamment caractéristique pour être utile.

6
répondu Michael C. O'Connor 2018-09-15 13:56:26

c'est drôle parce que j'aurais été d'accord avec S. Lott sur L'utilisation de Python comme moteur de règles. J'ai une perspective complètement différente maintenant que je l'ai fait.

si vous voulez un moteur complet, il a besoin de plusieurs pièces mobiles. Nous avons construit un moteur de règles Python/Django complet et vous seriez surpris de ce qui doit être construit pour obtenir un grand moteur de règles en marche. Je vais expliquer plus loin, mais d'abord le site web est http://nebrios.com .

d'Un moteur de règles devrait au moins avoir:

  • "Acess Control Lists - voulez-vous que tout le monde voit tout?
  • key/Value pair API - KVP stocke l'état, et toutes les règles réagissent aux états modifiés.
  • Debug mode - être capable de voir chaque état modifié, ce qui l'a changé et pourquoi. Primordial.
  • Interaction par formulaires web et e-mail - être en mesure de script rapidement un formulaire web est un énorme plus, avec l'analyse des e-mails entrants systématiquement.
  • Process ID's - ceux-ci tracent un" fil " de la valeur d'entreprise. Autrement, les processus se chevaucheraient continuellement.
  • Sooo beaucoup plus!

donc essayer Nebri, ou les autres je liste ci-dessous pour voir si elles répondent à vos besoins.

voici le mode de débogage

enter image description here

un formulaire généré automatiquement

enter image description here

Un exemple de règle de workflow:

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}}""")

donc, non, il n'est pas simple de construire un moteur de flux de travail basé sur des règles et des événements en Python seulement. Nous avons été à elle pendant une année! Je vous conseille d'utiliser des outils comme

3
répondu Adam 2014-01-08 00:36:02

je peux ajouter une bibliothèque de plus qui prend en charge à la volée les changements sur les composants de flux de travail contrairement à ses équivalents.

Regardez django-rivière

2
répondu Ahmet DAL 2016-06-13 15:13:05

ActivFlow : un moteur Générique, léger et extensible de flux de travail pour le développement agile et l'automatisation des opérations complexes de processus D'Affaires.

vous pouvez avoir un workflow entier modélisé en un rien de temps!

Étape 1: Enregistrement De L'Application De Flux De Travail

WORKFLOW_APPS = ['leave_request']

Étape 2: Configuration De L'Activité

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

Étape 3: Définition Du Flux

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
    }
}

Étape 4: Règles D'Affaires

def validate_request(self):
    return self.reason == 'Emergency'
1
répondu faxad 2016-07-25 07:08:11

je migrer django-goflow de django 1.X-python 2.X pour s'adapter à django 2.X-python 3.x, le projet est à django2-goflow

0
répondu mikewolfli 2018-08-08 04:36:15