在 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'))
我被要求在星期五发送一封电子邮件,其中包含符合一组条件的项目列表。数据库前端是用 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'))