2015-04-21 43 views
0

我被要求在星期五發送一封電子郵件,其中列出了符合一系列條件的項目。數據庫前端是用Django和它的內部應用程序編寫的。我想鏈接到電子郵件中項目的管理頁面。Django /芹菜的逆向網址

在我的機器我想

reverse("admin:index") 

,我注意到,它僅從芹菜任務返回

admin 

,而在標準的Django視圖將返回

127.0.0.1:8000/admin/ 

有沒有辦法解決這個問題?我寧願不要硬編碼的網址開始。

我已成立芹菜如教程「使用Django第一步驟」中描述的,並且具有

myproject/myproject/celery.py 

文件中定義的應用程序(旁邊settings.py和urls.py)和

project/myapp/tasks.py 

文件與實際任務。

回答

1
reverse()

總是返回相對域的URL,即/admin/。增加便攜性的一個選擇是使用sites framework

由於您的Celery任務中沒有request對象,因此您必須在設置中明確設置SITE_ID,並在數據庫中設置站點的名稱和域。那麼你可以這樣做:

from django.contrib.sites.models import Site 
url = "%s%s" % (Site.objects.get_current().domain, reverse('admin:index')) 
+0

好吧,我說得通。我想在Django應用程序中使用reverse,然後將URL傳遞給任務也可以。 –

0

通常,django中的URL是相對的,即當您懸停鏈接時發現的「127.0.0.1:8000」部分來自您正在從該位置瀏覽網站的事實。嘗試查看生成的URL的href值。

一個簡單的解決問題的方法是連接與域反向輸出,即

'http://example.com/'+reverse('admin:index') 
+1

我認爲這是由於芹菜工作人員是與Django應用程序不同的過程。我試圖避免硬編碼選項,因爲移動服務器可能會成爲問題 - 這是使用反轉的主要原因之一。 –

+0

對於此AFAIK,您需要一個請求對象,請參閱http://stackoverflow.com/questions/4150258/django-obtaining-the-absolute-url-without-access-to-a-request-object進行討論。您也可以使用網站配置:https://docs.djangoproject.com/en/dev/ref/contrib/sites/ – related