Django的服务对象
django-service-objects的Python项目详细描述
django服务对象
Django的服务对象
什么?
这是一个小库,它提供了一个Service
基类来派生服务对象。什么是服务对象您可以阅读this blog post中有关原因和方式的更多信息,但在大多数情况下,它会封装您的业务逻辑,将其与视图和模型方法分离。将业务逻辑放在服务对象中。
安装指南
从pypi安装:
pip install django-service-objects
将service_objects
添加到INSTALLED_APPS
:
# settings.pyINSTALLED_APPS=(...'service_objects',...)
示例
假设你想注册新用户你可以做一个CreateUser
服务。
fromservice_objects.servicesimportServiceclassCreateUser(Service):email=forms.EmailField()password=forms.CharField(max_length=255)subscribe_to_newsletter=forms.BooleanField(required=False)defprocess(self):email=self.cleaned_data['email']password=self.cleaned_data['password']subscribe_to_newsletter=self.cleaned_data['subscribe_to_newsletter']user=User.objects.create_user(username=email,email=email,password=password)ifsubscribe_to_newsletter:newsletter=Newsletter.objects.get()newsletter.subscribers.add(user)newsletter.save()WelcomeEmail.send(user,is_subscribed=subsribe_to_newsletter)returnuser
注意,它基本上是一个django表单,但是有一个process
方法。当您在进程上调用execute()
时,将调用此方法如果输入无效,则会引发InvalidInputsError
使用方法如下:
CreateUser.execute({'email':'kvothe@edemaruh.com','password':'doorsofstone','subscribe_to_newsletter':True,})
现在你可以在任何地方使用它。
在您的视图中
# views.py# Function Based Viewdefcreate_user_view(request):form=NewUserForm()ifrequest.method=='POST':form=NewUserForm(request.POST)ifform.is_valid():try:CreateUser.execute(request.POST)returnredirect('/success/')exceptException:form.add_error(None,'Something went wrong')returnrender(request,'registration/new-user.html',{'form':form})# Class Based ViewclassCreateUserView(ServiceView):form_class=NewUserFormservice_class=CreateUsertemplate_name='registration/new-user.html'success_url='/success/'
管理命令
# management/commands/create_user.pyclassCommand(BaseCommand):help="Creates a new user"defadd_arguments(self,parser):parser.add_argument('email')parser.add_argument('password')defhandle(self,*args,**options):user=CreateUser.execute(options)self.stdout.write(f'New user created : {user.email}')
在您的测试中
classCreateUserTest(TestCase):deftest_create_user(self):inputs={'email':'kvothe@edemaruh.com','password':'do0r$0f$stone42','subscribe_to_newsletter':True,}CreateUser.execute(inputs)user=User.objects.get()self.assertEqual(user.email,inputs['email'])newsletter=Newsletter.objects.get()self.assertIn(user,newsletter.subscribers.all())
你想去哪儿都行。您甚至可以在其他服务中执行服务。可能性是无穷的!
文档
文档可以在readthedocs上找到
如果您对服务对象有任何疑问,可以发tweet给我@mixxorz。