跳转到主要内容

Django的服务对象

项目描述

django-service-objects Latest Version

Build Status Python Support PyPI - Django Version License

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-py3-none-any.whl (11.1 kB 查看散列)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面