【问题标题】:Dynamic database for DjangoDjango 的动态数据库
【发布时间】:2017-01-04 16:34:16
【问题描述】:

我有一个简单但有些复杂的模式要实施。我正在创建一个应用程序,该应用程序基本上需要为多个客户提供白标。 每个客户都应该拥有自己的数据库,其中包含自己的信息。 这个想法是让这些客户在请求中或连接时发送签名(令牌等),识别他们,以便应用知道从哪个数据库获取信息。

我在这里和那里读到过不应更改设置,但我想知道如何简单地实现这一点?

需要超级管理员能够动态创建新数据库,并且客户能够使用此特定数据库访问应用程序,而无需完全重新部署应用程序,也无需事先知道数据库的名称在设置中。

应该如何做到这一点?

【问题讨论】:

  • 每次都使用新数据库有约束吗?我宁愿将所有数据放在同一个数据库中,并由用户调用数据。如果您对此感到满意,我可以写下如何实现这一点的整个架构
  • 这个想法是尽可能地分离数据。这主要是一个安全问题,一个应用程序的数据不应该被另一个应用程序访问,所以如果数据库是分开的,至少可以确保这一点。
  • 好吧,有道理

标签: django


【解决方案1】:

我很快就把它放在一起了。如果这个方法有任何漏洞,请告诉我(我也会学习)。

理想情况下,您可以有多个 user_types 来处理这种情况,管理员可以在需要时处理所有数据,而用户可以处理与他/她的实例相关的数据。

models.py

class UserModel(BaseUser):
   # fields related to user details that are not already present in BaseUser
   USER_TYPES = (
                  ("A","Admin"),
                  ("U","User"),
                )
   type = models.CharField(max_length=2, choices=USER_TYPES, default="U")

class AppModel(models.Model):
    # fields related to the model
    field = models.CharField(max_length=255)
    user = models.ForeignKey(UserModel)

在视图中,我们可以检查 AppModel 实例用户和登录用户(来自请求)。

views.py

def access_data(request, data_id):
    data = AppModel.objects.get(pk=data_id)
    if data.user == request.user:
        #do some thing with the data
    else:
        ## Forbidden request
        return redirect( "403-Error") 

你甚至可以为此写一个decorator(检查多个视图)

urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
   url(r'^access_data/(\d+)$', views.access_data, name='access_data'),
]

如果需要进一步说明,如果对安全性有任何疑问,请告诉我。

EDIT1:添加到网站的链接 看看这个:Django 有sites 功能。这可以帮助您为站点的每个实例设置单独的设置/数据库。

【讨论】:

  • 这根本没有回答我的问题。我的需要是将数据实际保存在单独的数据库中,这里不是这种情况。我要检查网站方面,但乍一看它似乎也没有回答我的问题。
猜你喜欢
  • 2011-09-28
  • 2014-07-16
  • 2021-08-05
  • 2014-04-03
  • 2020-07-03
  • 2012-12-24
  • 2012-04-12
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多