Django的服务对象

django-service-objects的Python项目详细描述


django服务对象Latest Version

Build StatusPython SupportLicense

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么@DELETE REST不起作用?   带有JPA2的java表值参数。1和Hibernate,Sql Server   如何将Java类添加到Xamarin VS2017项目   绘制多边形时出现java空指针异常   java Apache WebClient 303状态未重定向   java如何用一组字符串数组从数据库中获取数据   java是否可以使用Google Drive API向文件中添加脚本?   java组织。阿帕奇。贾斯珀。JspC jar文件下载   java在整个JSON映射中将单个值作为JSON流   通过命令行将文件输入到java   java rs.next()总是返回false   java标记异常,通知调用方利用异常消息   java Spring YML数组属性为空