在 Django / Celery 中反转 url

Reversing urls in Django / Celery

我被要求在星期五发送一封电子邮件,其中包含符合一组条件的项目列表。数据库前端是用 Django 及其内部应用程序编写的。我想 link 到电子邮件中项目的管理页面。

我正在尝试在我的开发机器上

reverse("admin:index") 

我注意到它只是 returning

admin 

来自 Celery 任务,而在标准 Django 视图中,这将 return

127.0.0.1:8000/admin/

有办法解决这个问题吗?我不想硬编码 url 的开头。

我已经按照 "first steps with Django" 教程中的描述设置了 Celery,并且有一个

myproject/myproject/celery.py

定义应用程序的文件(以及 settings.py 和 urls.py)和

project/myapp/tasks.py 

包含实际任务的文件。

通常 django 中的 URL 是相对的 - 即当您将鼠标悬停在 link 上时看到的“127.0.0.1:8000”部分来自于您正在从该位置浏览网站这一事实。尝试查看生成的 URL 的 href 值。

解决您的问题的一个简单方法是将反向输出与域连接起来,即

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

reverse() always returns 相对域 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'))