如何适当地构建一个较大的Django网站,以保持可测试性和可维护性?
本着最好的django精神(我希望),我们开始时不太关心网站不同部分之间的去耦.我们确实将其分为不同的应用程序,但是通过共同使用模型类和直接方法调用,它们直接相互依赖.
这变得越来越纠结.例如,我们的一项操作/服务如下所示:
def do_apply_for_flat(user, flat, bid_amount):
assert can_apply(user, flat)
application = Application.objects.create(
user=user, flat=flat, amount=bid_amount,
status=Application.STATUS_ACTIVE)
events.logger.application_added(application)
mails.send_applicant_application_added(application)
mails.send_lessor_application_received(application)
return application
该功能不仅执行实际的业务流程,不执行功能,它还处理事件记录并向相关用户发送邮件.我认为这种方法没有内在的错误.但是,正确地推理代码甚至测试应用程序变得越来越困难,因为从知识和程序上分离各个部分变得越来越困难.
因此,我的问题是,大男孩如何构建应用程序,使得:
>可以隔离测试应用程序的不同部分
>通过仅启用特定测试确实需要的零件,测试可以保持快速
>减少代码耦合
我对这个问题的看法是引入一个集中的信号中心(单个python文件中只是一堆django信号),单个django应用可以发布或订阅.上面的示例函数将发布一个application_added事件,邮件和事件应用程序将监听该事件.然后,为了进行有效的测试,我将断开不需要的部分.这也大大增加了解耦,因为服务根本不需要知道发送邮件.
但是,我不确定,因此对这些问题的公认做法非常感兴趣.
解决方法:
将应用程序的某些部分转移到不同的微服务.这将使您的应用程序的某些部分专注于正确执行一两项操作(例如,事件记录,电子邮件).代码耦合也减少了,站点的不同部分也可以单独进行测试.
The microservice architecture style involves developing a single application as a collection of smaller services that communicates usually via an API.
您可能需要使用类似Flask的较小框架.
资源:
有关微服务的更多信息,请单击此处:
标签:python,django