簡體   English   中英

Django CMS:如何避免在設置中設置 SITE_ID?

[英]Django CMS: How to avoid SITE_ID to be set in settings?

我們正在使用Django CMS一段時間,並且需要將我們的網站遷移到使用 Django Sites 框架的多站點實施。 我們想使用CurrentSiteMiddleware來檢測使用了哪個站點(基於子域)。 結果,我們將有一個由中間件設置的request.site.id ,它基於當前用戶對我們網站的請求。

我試圖找到如何在不分叉的情況下使用 Django CMS 的最佳方法,但沒有找到如何做到這一點的好方法。

我們實際需要什么:

  • 每個頁面可以在當前站點上使用,也可以同時在幾個站點上使用。 為此,Django 文檔建議將M2M FK 從每篇文章 object 中添加到站點model(在我們的例子中,它是 Page 對象)。 但是TreeNode具有到Site model 的 FK,這意味着只能將一個 Page 映射到單個站點。 但是我們需要將 map 一個頁面同時發送到一個或幾個站點。
  • we want to use Django Sites framework , because Django has it built-in and creators of Django use it on their projects (and it's for what is was designed - to map some object to one or few sites at the same time). 在我看來,在 web 應用程序的同一實例上運行多站點解決方案是非常明確的方法。
  • 我們需要有一個應用程序實例,因為我們已經共享了需要跨多個組織使用的插件(每個組織在子域上都有自己的站點)。
  • 我們計划讓數百個組織使用我們的共享代碼庫,但它無法為每個新子域運行一個新實例。 在維護、升級等方面也更難。但看起來當前實現中的 Django CMS 只能在settings.py文件中設置SITE_ID的每個實例中工作。
  • 當我們從 settings.py 中刪除 SITE_ID 定義時,Django 無法啟動 web 服務器,因為SITE_ID CMS 使用設置文件中的get_current_site() get_site_id() () 和 get_current_site() 我試圖模擬這種用法,但想為此找到更好的方法。

請幫助我們找到如何繼續使用 Django CMS 的方法,而無需編寫我們自己的類似 CMS 的自行車解決方案。 我們通常喜歡 Django CMS,並希望在我們已有 5 年歷史的社交項目中繼續使用它。

需要你的幫助。

經過幾天的調查,我得出結論,Django CMS 的設計方式是必須在settings.py文件中設置SITE_ID屬性。 在許多地方,它無法訪問請求 object,從中我們可以潛在地識別出哪個站點用於發出請求。

我發現的唯一方法是在每個傳入請求時動態更改我自己的中間件中的設置。 這是非常奇怪的做法,但是因為 Django CMS 在我們的網站中被積極使用,我們不能直接替換它——我們需要使用這種 hack 方式,至少現在是這樣。 而 Django 應用程序需要在單線程中運行才能實現這種方法。

Idea 是從django-multisite項目中借來的。

暫無
暫無

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

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