簡體   English   中英

django SITE_ID 通過查詢

[英]django SITE_ID by query

我有一個 django 應用程序。 我正在添加第二個站點。

所以現在我需要正確設置 SITE_ID。 這很容易,除了因為它是 Site 表中的主鍵 id,這意味着該值取決於添加(並最終刪除)站點的順序。 這很脆弱,甚至沒有討論如果開發人員在該表中做了任何臨時工作,他們將如何對其進行排序。 通過查詢設置它要好得多。

SITE_ID = Site.objects.get(name='my_site_name').id

但是設置WSGI_APPLICATIONsettings_myapp.py文件幾乎是唯一可能知道我正在運行哪個應用程序的文件。 我可以嘗試修改該站點特定settings文件中的設置,但此時導入設置會導致SECRET_KEY尚未定義的錯誤。

有沒有一種強大的方法來做到這一點?

這是我如何解決我在問題中陳述的問題的總結。 當我問這個問題時,我並不知道,實際上有幾個方面需要不同的方法。

一點中間件對已部署的實例(即,不是開發實例)有很大幫助。 此解決方案提供了 django 3.1 就緒代碼片段,因為過去存在的解決方案不再與現代 django 兼容。

對於開發人員,我將其添加到我的settings.py

DEFAULT_SITE_ID = os.getenv('DEFAULT_SITE_ID')

所以上面的代碼片段變成了這樣:

class DynamicSiteDomainMiddleware:
    default_site_id = None

    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.
        self.default_site_id = settings.DEFAULT_SITE_ID
        if self.default_site_id is not None:
            current_site = Site.objects.get(id=self.default_site_id)

    def __call__(self, request):
        if self.default_site_id is None:
            try:
                current_site = Site.objects.get(domain=request.get_host())
            except Site.DoesNotExist:
                current_site = Site.objects.get(id=settings.DEFAULT_SITE_ID)
        else:
            current_site = Site.objects.get(id=self.default_site_id)

        request.current_site = current_site
        settings.SITE_ID = current_site.id

        response = self.get_response(request)
        return response

換句話說,如果開發人員已設置DEFAULT_SITE_ID (例如,在調用manage.py時在命令行上),則使用該值。 否則,我們會根據請求查看 SNI。

這留下了一個未解之謎:如何處理urlpatterns 我有兩個站點(很快三個),它們的 URL 方案略有不同。 但是在主urls.py中,站點信息在這個聰明的中間件解決方案下尚不可用,因為 urlpatterns (自然且必然)在任何請求發生之前設置。

對我來說最好聞的方法設置環境變量,以便settings.py可以為其特定情況設置ROOT_URLCONF

ROOT_URLCONF = os.getenv('ROOT_URLCONF', 'transport_nantes.urls_tn')

一個明顯的缺點是我們最終遇到了兩種不兼容的設置站點數據的機制: DEFAULT_SITE_ID + SNI 和ROOT_URLCONF 然而,這並不像看起來那么糟糕,因為這是問題的兩個獨立方面:我是什么站點以及我打算擁有的 URL 方案。 這需要對生產和暫存部署代碼進行非常小的更改以設置適當的環境變量。

最后,在每個url_XYZ.py文件中,我為該版本網站的基本模板設置了一個變量。 (問題在於鏈接不同。如果只是更改徽標,那會更容易。)我將字典中的值傳遞給包含的 url 文件,因此我可以在渲染視圖時使用該知識,即使視圖功能通常在多個站點和 URL 方案之間共享。

那么為什么不也為SITE_ID設置一個環境變量呢? 這又回到了最初的問題:站點 id 是脆弱的,它是站點表中的主鍵。 可以合理地想象一些維護會使站點表保持不變,除了更改的主鍵(例如,無意刪除然后重新創建記錄)。 因此,按名稱查找值更加健壯。

另一方面, ROOT_URLCONF變量的優點是它綁定到站點表。 例如,站點 X 有一個特定的 URL 方案,無論 X 是在生產中運行還是在暫存或測試中運行,都是如此,所有這些都有不同的 FQDN。

暫無
暫無

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

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