Django的服务对象
项目描述
django-service-objects 
Django的服务对象
是什么?
这是一个小型库,提供了一个Service
基类,用于从其中派生你的服务对象。什么是服务对象?你可以在这篇博客文章中了解更多关于原因和做法的信息,但主要来说,它封装了你的业务逻辑,将其与视图和模型方法解耦。将你的业务逻辑放在服务对象中。
安装指南
从pypi安装
pip install django-service-objects
将service_objects
添加到你的INSTALLED_APPS
# settings.py
INSTALLED_APPS = (
...
'service_objects',
...
)
示例
假设你想注册新用户。你可以创建一个CreateUser
服务。
from django import forms
from service_objects.services import Service
class CreateUser(Service):
email = forms.EmailField()
password = forms.CharField(max_length=255)
subscribe_to_newsletter = forms.BooleanField(required=False)
def process(self):
email = self.cleaned_data['email']
password = self.cleaned_data['password']
subscribe_to_newsletter = self.cleaned_data['subscribe_to_newsletter']
self.user = User.objects.create_user(username=email, email=email, password=password)
self.subscribe_to_newsletter = subscribe_to_newsletter
if self.subscribe_to_newsletter:
newsletter = Newsletter.objects.get()
newsletter.subscribers.add(self.user)
newsletter.save()
return self.user
def post_process(self):
WelcomeEmail.send(self.user, is_subscribed=self.subsribe_to_newsletter)
# Calling a celery task after successfully creating the user.
create_billing_account.delay(self.user.id)
请注意,这基本上是一个Django表单,但有一个process
方法。当你调用进程上的execute()
时,会调用此方法。如果输入无效,它会引发InvalidInputsError
。
新添加的post_process
也可以用于执行在服务完成后需要执行的其他任务。
以下是使用方法
CreateUser.execute({
'email': 'kvothe@edemaruh.com',
'password': 'doorsofstone',
'subscribe_to_newsletter': True,
})
现在您可以在任何地方使用它。
在您的视图中
# views.py
# Function Based View
def create_user_view(request):
form = NewUserForm()
if request.method == 'POST':
form = NewUserForm(request.POST)
if form.is_valid():
try:
CreateUser.execute(request.POST)
return redirect('/success/')
except Exception:
form.add_error(None, 'Something went wrong')
return render(request, 'registration/new-user.html', {'form': form})
# Class Based View
class CreateUserView(ServiceView):
form_class = NewUserForm
service_class = CreateUser
template_name = 'registration/new-user.html'
success_url = '/success/'
管理命令
# management/commands/create_user.py
class Command(BaseCommand):
help = "Creates a new user"
def add_arguments(self, parser):
parser.add_argument('email')
parser.add_argument('password')
def handle(self, *args, **options):
user = CreateUser.execute(options)
self.stdout.write(f'New user created : {user.email}')
在您的测试中
class CreateUserTest(TestCase):
def test_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上找到。
如果您对服务对象有任何问题,可以给我发推特@mixxorz。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
django-service-objects-0.7.1.tar.gz (9.8 kB 查看散列)
构建分布
关闭
django-service-objects-0.7.1.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 9c14c383149f7369c2306439a8b1fec3d6c85c129e8e22479c131efab1530eb1 |
|
MD5 | 7753958e64fac2837d01301419fd13a3 |
|
BLAKE2b-256 | 5d4186414421c90af067a9ca232bfb86c486ed1dcc7a9da4f5925ee85189252d |
关闭
django_service_objects-0.7.1-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | c13961062f35c68d8f59a98f75e970636aa8d4fc7e9dad85d222a39c13151449 |
|
MD5 | ae2be7ae0109638bfea5eae923141116 |
|
BLAKE2b-256 | 568d290d9cdf0954da637f723717b2f2debd354d3d3cf7b251c6357f172a1f80 |