簡體   English   中英

在單個項目中為多個應用程序使用django用戶身份驗證和taggit

[英]Using django user authentication & taggit for multiple apps in a single project

背景:我有5個獨立的Django項目,我試圖將它們合並到由幾個應用程序組成的1個Django項目中。 換句話說:projA有appA,projB有appB&projC有appC等我想要1個masterProj有appA,appB和appC。

目前,每個應用程序都連接到它自己的獨立數據庫(應用程序不共享數據)。 每個項目都使用Django用戶身份驗證,Django注冊,taggit,配置文件,注釋和sorl-thumbnail。

我正在使用Django 1.4並根據此stackoverflow答案設置數據庫路由,這樣,一旦合並到一個項目中,新組合的Django項目中的每個應用程序仍然能夠連接到自己的數據庫。 這很順利,但我開始遇到用戶身份驗證和taggit等問題:

1)如前所述,每個應用程序連接到不同的數據庫,每個數據庫都有一個名為“auth_user”的表。 但是,我發現對auth_user表的所有讀/寫調用(無論哪個應用程序進行讀/寫調用)都被路由到默認數據庫(在本例中為appA的數據庫):

# settings.py:
DATABASES['default'] = DATABASES['appA']
DATABASE_ROUTERS = ['appA.db.DBRouter', 'appB.db.DBRouter', 'appC.db.DBRouter']

# appA/dbrouterA.py (appB, appC routers are identical this, replacing 'appA' with 'appB', etc.)
class DBRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'appA':
            return 'appA'
        if model._meta.app_label == 'auth':
            return 'appA'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'appA':
            return 'appA'
        if model._meta.app_label == 'auth':
            return 'appA'
        return None

2) 假設我使路由工作,如果用戶登錄到appA,我不希望他們登錄到appB 我見過很多人發布了相反的問題(他們希望他們的應用程序共享用戶憑據)但是有沒有人在同一個項目中的幾個獨立應用程序中成功使用Django用戶身份驗證? 如果是這樣,你是怎么做到的?

3)我從我的taggit代碼中得到以下錯誤,但我無法弄清楚如何將“related_name”參數傳遞給taggit。 我正在使用taggit的基本實現 - 而不是子類化任何東西:

# appA/models.py
tags = TaggableManager(blank=True)

# appB/models.py
tags = TaggableManager(blank=True)

錯誤:

appA.userprofile: Accessor for m2m field 'tagged_items' clashes with related m2m field 'TaggedItem.userprofile_set'. Add a related_name argument to the definition for 'tagged_items'.
appB.userprofile: Accessor for m2m field 'tagged_items' clashes with related m2m field 'TaggedItem.userprofile_set'. Add a related_name argument to the definition for 'tagged_items'.

4)我開始覺得組合所有這些應用程序是一個滑坡; 后來我可能會遇到沒有浮出水面的sorl-thumbnail或評論的問題。 有沒有人成功將應用程序組合到一個項目中? 或者我是否嘗試做一些Django沒有從根本上支持的事情?

先謝謝您的幫助!

Django的架構旨在圍繞Django項目和幾個Django應用程序展開。 項目本身只是您的設置和主URL配置模塊,而應用程序是遵循一些文件約定的簡單包。

現在,應用程序本身永遠不會耦合到特定項目(盡管可以通過引用它們將它們耦合到其他應用程序)。 我們的想法是允許您保留設計項目源結構的自由,並且大多數Django項目都采用一種方法,即在大多數Python應用程序的項目頂層包中分發Django應用程序。 這種方法可以方便地獲得項目提供的所有功能的整體視圖(當您應用有意義的應用程序標簽時),創建名稱空間並為開發人員提供方便且有條理的訪問特定項目源的途徑。

這對於大型項目以及當您想要並置和合並多個不同的項目時都很有用,這些項目可以重復使用類似的設計和方法。 雖然這只會影響項目的結構,但是選擇是否為單個Django項目配置一個配置,或者為您的固定Django應用程序設置幾個Django項目會產生一些重要的后果。

當您創建Django項目時,您基本上將Django應用程序插入到框架的工具中並公開應用程序行為,正如我們在Web應用程序中所理解的那樣,通過配置和包括來自Django應用程序的URL和視圖的映射模式。

關鍵是您可以以適合您的任何方式重新組織源。 你的包可以像proj.appAproj.appB等那樣組織,或者proj.common1proj.common2proj.projA.app1proj.projA.app2proj.projB.app1 ,這真的取決於你。

您應該知道的是,您不需要單個設置和URL模塊,並且需要使用數據庫路由和管理數據庫連接,您也可以為每個項目設置一個設置和URL模塊,引用不同的應用程序並暴露不同的行為。 對於每個項目數據庫設置,您已經重用的代碼並同時保持每個項目的數據庫數據和狀態不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM