Django的动态数据库

时间:2017-01-04 16:34:17

标签: django

我有一个简单但有些复杂的模式。我正在努力创建一个需要基本上作为几个客户的白色标签的应用程序。 每个客户都应该拥有自己的数据库和自己的信息。 这个想法是为那些客户在请求或连接中发送签名(令牌等),识别它们以便应用程序知道从哪个数据库获取信息。

我在这里和那里读过不应该改变设置,但我想知道如何才能实现这一点?

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

如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

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

理想情况下,您可以有多个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功能。这可以帮助您为站点的每个实例设置单独的设置/数据库。