我想知道如何解决多个(分离的)django项目/微服务之间的模型结构共享问题。例如:
每个项目都使用相同的django模型。是否有一种正确的解决方法?
答案 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为这些模型提供界面:
答案 3 :(得分:1)
Django模型只是一个Python模块,当然Django使用内省在其他模块(即表单,管理员)中做了很多“魔术”,但如果需要,模型本身可以单独使用。
所以没有问题......如果你为你命名的每个项目(在同一台机器上或不同的机器上)使用不同的“Django项目”,那么只需将你的模型作为单独的“Django app”并设置每个项目来使用它。如果您指定的每个项目都是“Django app”(在这种情况下显然在同一台机器上),那么只需在每个“项目”中导入模型模块并使用它。即使您不使用Django,说您的“API项目”基于Flask,您仍然可以在Flask模块中导入Django模型。
在Django模型的场景背后有数据库,它不关心查询的位置,而Django只是提供了一种通过Python类使用数据库的便捷方式。因此,如果来自不同应用程序或项目的模型设置为使用相同的数据库,那么它们将被“共享”。