定义服务模式的django扩展,用于在不同端点中重用业务逻辑。
serious-django-services的Python项目详细描述
https://github.com/serioeseGmbH/serious-django-services
严肃的django服务定义了django的服务模式。
服务所做的是抽象操作(首先是:模型上的操作) 以及它们远离端点的业务逻辑,因此您可以为 api、graphene端点和经典的html django视图。
每个服务还定义service_exceptions,一个异常列表 可以扔。如果您的serivce中没有这些,请确保只设置service_exceptions = []。 否则,您将在类的定义上得到一个错误,以强制明确 您的服务可以引发异常。
在这个包中,我们只定义了一个Service基类,您需要继承它来编写自己的基类 服务。下面是一个玩具示例:
class WeAreClosedException(Exception): pass class OrderTakeoutService(Service): service_exceptions = (WeAreClosedException,) @classmethod def create_order(cls, customer, item_no): if datetime.datetime.now().hour > 22: raise WeAreClosedException("Sorry, we're closed after 10pm.") if not customer.has_perm(PermissionToOrder): raise PermissionDenied("Sorry, you can't order right now.") # when someone was too rude order = Order.objects.create(customer=customer, item=item_no) return order
现在,您可以将此业务逻辑保留在此服务本地,并在需要的任何地方使用它 创建订单。例如,在石墨烯突变中:
class OrderTakeoutMutation(graphene.Mutation): class Arguments: item_no = graphene.String() success = graphene.NonNull(graphene.Boolean) error = graphene.String() order_no = graphene.ID() def mutate(self, info, item_no): # get_user_from_info() is from `serious-django-graphene` customer = get_user_from_info(info) try: order = OrderTakeoutService.create_order(customer, item_no) except OrderTakeoutService.exceptions as e: return OrderTakeoutMutation(success=False, error=str(e)) return OrderTakeoutMutation(success=True, order_no=order.pk)
然后可以对rest api或django视图执行非常类似的操作。你的视野没有一级 逻辑需要知道你的关门时间,或者一些客户可能被禁止订购。
快速启动
使用pip安装软件包:
pip install serious-django-services
在已安装的应用程序设置中添加“严肃的Django服务”,如下所示:
INSTALLED_APPS = [ ... 'serious_django_services', ]
导入serious_django_services.Service,并为要定义的每个服务对其进行子类化。
在服务上定义所需的操作,每个操作都是@classmethod。
在视图级代码中使用服务的操作。