我正在用Python编写日志收集/分析应用程序,我需要编写一个"规则引擎"来匹配日志消息并对其进行操作.
它需要具备以下功能:
我想象一个示例规则可能是这样的:
(message ~ "program\\[\d+\\]: message" and severity >= high) or (severity >= critical)
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用PyParsing或类似实际解析规则并构造解析树.
我想到的当前(尚未实现的)设计是为每个规则类型创建类,并根据解析树构造和链接它们.然后,每个规则都有一个"匹配"方法,可以使消息对象返回它是否与规则匹配.
很快,像:
class RegexRule(Rule):
def __init__(self, regex):
self.regex = regex
def match(self, message):
return self.regex.match(message.contents)
class SeverityRule(Rule):
def __init__(self, operator, severity):
self.operator = operator
def match(self, message):
if operator == ">=":
return message.severity >= severity
# more conditions here...
class BooleanAndRule(Rule):
def __init__(self, rule1, rule2):
self.rule1 = rule1
self.rule2 = rule2
def match(self, message):
return self.rule1.match(message) and self.rule2.match(message)
Run Code Online (Sandbox Code Playgroud)
然后,这些规则类将根据消息的分析树链接在一起,并在最高规则上调用match()方法,该方法将向下级联,直到评估完所有规则. …
我正在寻找Python的工作流库/框架.我很惊讶在那里我找不到任何简单而且不依赖于Zope/Plone的东西.
有谁知道一个开源,简单的工作流库/框架.它最好支持Django,但不是必需的.
我一直在研究一个基本上是CRUD应用程序(创建,读取,更新,删除)的Web应用程序.最近,我开始研究我称之为"批准工作流程".基本上,会为物料生成请求,然后将其发送给经理批准.根据请求的不同,不同的人需要批准请求或者将其发送回请求者进行修改.批准者需要跟踪批准已批准的内容以及请求者需要查看其请求状态的内容.
作为一名"CRUD"开发人员,我正在努力解决如何设计这个问题.我应该拥有哪些数据库表?如何跟踪请求的状态?我应该如何通知用户他们的请求发生的操作?
他们的设计模式可以帮助我吗?我应该在我的代码中绘制状态机吗?
我认为这是一个通用的编程问题,但如果它有所不同,我正在使用Django和MySQL.
假设您正在构建一个基于Python的Web应用程序,该应用程序需要一些工作流管理,例如jBPM或Windows Workflow Foundation中的工作流管理.是否有一个在Python世界中提供此功能的库?
我想构建一个Django解决方案,该解决方案可以实时定义和更改工作流,希望通过更新BPMN图表而无需更改源代码和重新部署。
尽管在Java中(例如Camunda和Bizagi)这种功能已经存在了相当长的时间,但在Django的上下文中,由于我搜索的常规位置并没有提供令人满意的答案,因此似乎没有引起同样的兴趣。对2011年类似问题的回答显示,“工作流”一词如此广泛,可能意味着很多事情。但是,经过仔细检查,它似乎可以归结为两种方法:基于Django的工作流和BPMN引擎。
Github和Django软件包中列出的基于Django的工作流的问题在于,最流行/最稳定的工作流(例如Viewflow或ActivFlow)提供了某种框架来简化状态和过渡的实现,但最终,每当利益相关者改变对流程的想法时,您需要手工编写更改代码。很棒的Django列表中找到的最有前途的选项是django-river,它至少将工作流的状态和转换作为Django模型存储在数据库中,因此您可以随时进行更改。
另一个大方法是BPMN引擎。在弄乱了几个纯Python(非Django)选项之后,我设法使用bpmn_dmn使SpiffWorkflow正常工作。现在,我可以加载用Camunda Modeler制作的.bpmn图和.dmn表,并通过引擎运行它们,以基于一些参数获得最终事件。
from bpmn_dmn.bpmn_dmn import BPMNDMNXMLWorkflowRunner
filename = 'rates.bpmn'
runner = BPMNDMNXMLWorkflowRunner(filename, debugLog='DEBUG', debug=False)
data = {'size': 150, 'type': 'SH', 'country': 'US'}
runner.start(**data)
res = runner.getEndEventName()
print(res)
Run Code Online (Sandbox Code Playgroud)
这是直接且有用的,足以运行不需要人工干预的小型工作流程。但是,我仍然需要弥合从.bpmn图定义加载的工作流与Django解决方案固有的Views / Forms / Model状态之间的转换之间的鸿沟。
到目前为止,我最好的选择似乎是将工作流规范从SpiffWorflow转换为django-river模型数据库中的状态/转换记录,但是我想知道是否还有更好的选择。
python ×3
workflow ×3
django ×2
bpmn ×1
business-process-management ×1
django-river ×1
parsing ×1
python-3.x ×1
rules ×1