2012-03-11 83 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 
相關問題