2012-03-11 80 views
1

我想根据经过身份验证的用户路由(更改)数据库。我已经看了docs,但我不知道如何在用户登录时执行此操作...Django数据库路由器

我正在考虑在我的自定义UserProfile中添加一个字段database_name,然后我想通过此信息到数据库路由器,这将使开关...

我没有任何代码显示,因为我根本不知道如何实现这一点。

这篇文章莫名其妙地涉及我以前的post

所以该模式是这样的:

- Users (containing only the `UserProfile`) 
- user1 (containing the app database) 
- user2 (containing the app database) 
- ... 

你能为我指向正确的方向?

谢谢! BR

+1

你可能会想要写[中间件功能(https://docs.djangoproject.com/en/dev/topics/ http/middleware /)来检查每个传入的请求,获取当前用户并在其用户配置文件中检查一个标志,并相应地进行路由。 – 2012-03-11 08:38:12

+0

数据库和用户之间有什么关系?是对用户表进行水平分割,还是对不同的用户使用不同的数据库进行模型映射? – okm 2012-03-11 08:38:26

+0

请参考[这里] [1]关于如何玩的路由器 [1]帖子:http://stackoverflow.com/questions/12352360/different-database-for-each-django-网站/ 12353583#12353583 – karthikr 2012-09-22 23:13:40

回答

1

即使这是一个典型的SaaS应用程序请求,多租户通常有点难以做到,即使它是一个典型的SaaS应用程序请求。这里有一个链接,描述了一个approach,与我一起工作的公司开发的链接有点不同,黑客攻击contrib.sites,但数据库部分非常相似。

总之,如果你想要数据库多租户,你将不得不破解Django ConnectionHandler做你想做的。

+0

这种方法很好...但我并不真的需要子域名,我对Django有点新,所以黑客有点问题。 – Mission 2012-03-19 13:08:22

1

参考this职位上如何玩的路由器

DATABASE_ROUTERS = ['CustomDatabaseRouter',] #a setting that Django understands. 

class CustomDatabaseRouter(object): 

    def db_for_read(self, model, **hints): 
    site_name = get_current_site() 
    if site_name in ['site1']: 
     return 'db1' 
    if site_name in ['site2']: 
     return 'db2' 
    return 'default' 

    def db_for_write(self, model, **hints): 
    site_name = get_current_site() 
    if site_name in ['site1']: 
     return 'db1' 
    if site_name in ['site2']: 
     return 'db2' 
    return 'default' 

    def allow_syncdb(self, model, **hints): 
    site_name = get_current_site() 
    if site_name in ['site1'] and db == 'db1': 
     return True 
    if site_name in ['site2'] and db == 'db2': 
     return True 
    return False 
相关问题