Django模型跨多个项目/微服务。如何?

时间:2016-02-13 11:24:40

标签: django microservices

我想知道如何解决多个(分离的)django项目/微服务之间的模型结构共享问题。例如:

  1. 项目:API
  2. 项目:用户信息中心
  3. 项目:管理信息中心
  4. 项目:统计
  5. 每个项目都使用相同的django模型。是否有一种正确的解决方法?

4 个答案:

答案 0 :(得分:7)

Django的基本思想是将整个应用程序功能结合在一起,但这并不适用于您的情况。这是一个风格和意见问题,这是我在类似情况下所做的。

将应用功能拆分为两个项目区域:

mysite
   |
   | - db_access
   |         | --- app1
   |                 | ---- models.py
   |                 | ---- db_api.py
   |         | --- app2
   |                 | ---- models.py
   |                 | ---- db_api.py
   | - service
   |         | --- app1
   |                 | ---- urls.py
   |                 | ---- views.py
   |         | --- app2
   |                 | ---- urls.py
   |                 | ---- views.py

db_access部分包含模型,db_api.py包含查询,获取对象等,因此您不必查询模型,而是查询db_api。

而不是

item = app1.models.Items.objects.get(user=request.user)

使用

item = app1.db_api.get_first_item(user=request.user)

此样式可让您分享数据库和数据。模型一起访问,同时每个服务消耗它所需的内容,然后将其用于API,网站等。如果服务以某种其他服务不会(也不会)使用的方式使用某些数据,则将此查询在服务代码中,否则在db_api.py。

这更像是传统的应用程序,但它确实有效。

另一方面,同一个项目可以使用两个 git存储库,一个用于db_access(所有服务都用),一个用于特定服务。所以每个django项目实际上都是db_access repo,当然,如果项目代码来自两个存储库,那么服务repo-wsgi并不关心。

答案 1 :(得分:4)

两个可能的选择:

选项1 - 使用公共代码库并部署它的多个实例(每个微服务一个)。您可以遵循12factor Apps Methodology,只为每个已部署的实例加载一组不同的环境变量。 http://12factor.net/

选项2 - 将您的django代码拆分为自包含的应用程序,然后为每个包含这些项目和url配置的微服务创建一个项目。

如果这有用,我可以进一步扩展吗?

答案 2 :(得分:2)

如果你想在不同的python应用程序中使用相同的模型(不是模块,而是应用程序,具有不同的uwsgi实例等),那么我认为这是一个非常常见且方便的解决方案 - 通过一些API为这些模型提供界面:

  1. 您可以在每个项目中构建REST接口,然后调用适当的API方法来获取结果。
  2. 您可以使用Celery包基于AMQP传输构建内部API。然后,您需要配置您的应用程序以侦听一些RabbitMQ队列,该队列将用作项目通信的消息存储。

答案 3 :(得分:1)

Django模型只是一个Python模块,当然Django使用内省在其他模块(即表单,管理员)中做了很多“魔术”,但如果需要,模型本身可以单独使用。

所以没有问题......如果你为你命名的每个项目(在同一台机器上或不同的机器上)使用不同的“Django项目”,那么只需将你的模型作为单独的“Django app”并设置每个项目来使用它。如果您指定的每个项目都是“Django app”(在这种情况下显然在同一台机器上),那么只需在每个“项目”中导入模型模块并使用它。即使您不使用Django,说您的“API项目”基于Flask,您仍然可以在Flask模块中导入Django模型。

在Django模型的场景背后有数据库,它不关心查询的位置,而Django只是提供了一种通过Python类使用数据库的便捷方式。因此,如果来自不同应用程序或项目的模型设置为使用相同的数据库,那么它们将被“共享”。