Django:如何在信号处理程序中获取域名

时间:2016-10-22 15:26:17

标签: python django django-rest-framework

我正在尝试使用django信号发送一个包含我的网址的电子邮件。我发现了这个问题:https://stackoverflow.com/a/15521046/2385132并按照接受的答案中的建议继续进行,但在使用该代码时,我收到此错误:

AttributeError: 'NoneType' object has no attribute 'get_host'

哪个来自我的代码中的get_current_site

@receiver(post_save, sender=MyModel)
def post_obj_save(sender, instance: MyModel, **kwargs):
    def _get_html(obj: MyModel):
        return render_to_string('confirmation_email.html', _get_context(obj))

    def _get_context(obj: MyModel):
        current_site = get_current_site(request=None)
        domain = current_site.domain
        action = reverse('obj_activation', request=None, format=None, kwargs={})
        url = '{protocol}://{domain}/{action}'.format(protocol=PROTOCOL, domain=domain, action=action)        
        return {
            'header': _('Thank you for registering with ASDF.'),
            'prompt': _('In order to be able to log in into ASDF administrator panel, you have to activate your account using'),
            'link_name': _('this link'),
            'activation_url': url
        }

    send_mail(
        _('ASDF account activation'),
        _get_html(instance),
        EMAIL_FROM,
        [obj.owner.email],
        fail_silently=False,
    )

所以问题是:如何在信号中获得我的观点的完整网址?

顺便说一下。我正在使用django-rest-framework

1 个答案:

答案 0 :(得分:3)

在最近的Django版本中(可能是您的情况),如果您的设置中未定义SITE_ID ,则始终从请求中删除。请参阅1.8 Django版本中引入的this更改:

  

在Django 1.8中更改:

     

此功能现在将基于查找当前站点   request.get_host()如果未定义SITE_ID设置。

因此,在您的情况request=None中,您必须启用sites framework,当前网站/域的条目和SITE_ID设置指向{{1}中的正确实例}表,尝试这个,你会看到:)