Django:获取绝对URL而无需访问请求对象

Bel*_*dez 17 python django django-signals django-settings

我有一个类似下面的模型.创建实例时,我想向相关方发送电子邮件:

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='admin@example.com',
            recipient_list=[instance.notify_email,]
        )
signals.post_save.connect(new_stop_created, sender=TrainStop)
Run Code Online (Sandbox Code Playgroud)

但是,该reverse调用仅返回URL的路径部分.示例:/stops/9/status/.我需要一个完整的URL http://example.com/stops/9/status/.如何检索当前网站的主机名和端口(对于不使用端口80的测试实例)?

我最初的想法是通过变量使其可用settings.py,然后我可以根据需要访问.但是,有人认为有人可能会提出更强有力的建议.

ete*_*ode 5

正如 yedpodtrzitko 所提到的,有站点框架,但是,正如您所提到的,它在很大程度上是手动设置的。

需要在 settings.py 中进行设置,但它只比设置站点稍微少一些手动操作。(它可以处理多个域,就像站点和SITE_ID设置一样)。

有一个替换 get_absolute_url的想法,这会使这样的事情变得更容易,尽管我认为它的实现存在同样的问题(如何获取域、方案 [http vs https] 等)。

我一直在玩弄一个中间件的想法,它检查传入的请求并根据 HTTP HOST 标头值的频率构建某种“最有可能的域”设置。或者它可以针对每个请求单独设置此设置,以便您始终可以使用当前域。我还没有到认真研究它的地步,但这是一个想法。