2010-11-10 136 views
15

我有一個像下面這樣的模型。當創建一個實例,我想電子郵件發送給利害關係人:Django:獲取無需訪問請求對象的絕對URL

class TrainStop(models.Model): 
    name = models.CharField(max_length=32) 
    notify_email = models.EmailField(null=True, blank=True) 

def new_stop_created(sender, instance, created, *args, **kwargs): 

    # Only for new stops 
    if not created or instance.id is None: return 

    # Send the status link 
    if instance.notify_email: 
     send_mail(
      subject='Stop submitted: %s' % instance.name, 
      message='Check status: %s' % reverse('stop_status', kwargs={'status_id':str(instance.id),}), 
      from_email='[email protected]', 
      recipient_list=[instance.notify_email,] 
     ) 
signals.post_save.connect(new_stop_created, sender=TrainStop) 

然而,reverse調用僅返回URL的路徑部分。例如:/stops/9/status/。我需要一個完整的URL,如http://example.com/stops/9/status/。我將如何去檢索當前網站的主機名和端口(對於不使用端口80的測試實例)?

我最初的想法是通過settings.py中的變量使其可用,然後根據需要進行訪問。不過,以爲有人可能會有更強有力的建議。

回答

4

還有的網站框架,yedpodtrzitko提及,但正如你所說,這是非常手動安裝。

需要在settings.py中進行設置,但它只比設置網站的手動略少。 (它可以處理多個域名,以及站點和SITE_ID設置可以)。

有一個想法replacing get_absolute_url,這將使這樣的東西更容易,但我認爲它的實現遭受同樣的問題(如何獲得域,方案[http vs https]等)。

我一直在琢磨着一箇中間件的概念,該中間件檢查傳入的請求並根據HTTP HOST頭的值的頻率構造某種「最可能的域」設置。或者,也許它可以對每個請求分別設置此設置,因此您可以始終使用當前的域。我還沒有認真研究它,但這是一個想法。

+0

「如果他們不打算設置它,我的應用程序不會爲他們工作而煩心」,但這沒有幫助「?您如何稱呼」要求「是」沒有幫助「?這是一個簡單的要求爲什麼要這個應用程序是「神奇的」,而不需要設置?如果你不能依靠用戶,然後,他們會做一些其他的事情來顛覆應用程序,不是嗎?就像修改代碼一樣。只需說明所需的設置並完成它。不要華夫餅乾。 – 2010-11-11 02:56:29

+0

這是事實,但我的意思更多,它對我們目前對可靠域檢測方法的討論沒有幫助。不過,你說得對,我說我們「不能依賴用戶」就是這樣。 – eternicode 2010-11-11 03:15:32

+0

如果沒有請求,則無法檢測到域,並且「reverse」或「{%url%}」。其他任何**需要**設置。這很簡單。沒有理由爲此而華而不實。要求設置並完成。 – 2010-11-11 11:03:45

4

爲了得到當前站點有對象網站:

如果您沒有訪問請求對象,你可以使用網站模型的經理 GET_CURRENT()方法。然後您應該 確保您的設置文件包含SITE_ID設置。這 示例等同於前一個:

from django.contrib.sites.models import Site 

def my_function_without_request(): 
    current_site = Site.objects.get_current() 
    if current_site.domain == 'foo.com': 
     # Do something 
     pass 
    else: 
     # Do something else. 
     pass 

更多信息:http://docs.djangoproject.com/en/dev/ref/contrib/sites/

+0

我目前不使用網站框架。看起來它會比僅僅獲取當前域的價值更多的工作 - 無論如何都必須手動配置。謝謝你。 – 2010-11-11 00:48:00

+0

我很困惑。這正是網站框架的用途,它使您能夠將這些信息設置一次並隨時隨地使用。在數據庫中進行編輯比在設置文件中的編輯要容易得多,正如您所建議的那樣。那麼究竟是什麼問題呢? – 2010-11-11 09:20:02

+2

從站點文檔:「如果您的單個Django安裝支持多個站點,並且需要以某種方式區分這些站點,請使用它。」這不是一個包含多個網站的項目,所以實施一個模型來存儲這些數據對於我的情況來說是矯枉過正的。 – 2010-11-11 12:45:00

相關問題