2010-11-10 85 views
15

我有一个像下面这样的模型。当创建一个实例,我想电子邮件发送给利害关系人:Django:获取无需访问请求对象的绝对URL

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='[email protected]', 
      recipient_list=[instance.notify_email,] 
     ) 
signals.post_save.connect(new_stop_created, sender=TrainStop) 

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

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

回答

4

还有的网站框架,yedpodtrzitko提及,但正如你所说,这是非常手动安装。

需要在settings.py中进行设置,但它只比设置网站的手动略少。 (它可以处理多个域名,以及站点和SITE_ID设置可以)。

有一个想法replacing get_absolute_url,这将使这样的东西更容易,但我认为它的实现遭受同样的问题(如何获得域,方案[http vs https]等)。

我一直在琢磨着一个中间件的概念,该中间件检查传入的请求并根据HTTP HOST头的值的频率构造某种“最可能的域”设置。或者,也许它可以对每个请求分别设置此设置,因此您可以始终使用当前的域。我还没有认真研究它,但这是一个想法。

+0

“如果他们不打算设置它,我的应用程序不会为他们工作而烦心”,但这没有帮助“?您如何称呼”要求“是”没有帮助“?这是一个简单的要求为什么要这个应用程序是“神奇的”,而不需要设置?如果你不能依靠用户,然后,他们会做一些其他的事情来颠覆应用程序,不是吗?就像修改代码一样。只需说明所需的设置并完成它。不要华夫饼干。 – 2010-11-11 02:56:29

+0

这是事实,但我的意思更多,它对我们目前对可靠域检测方法的讨论没有帮助。不过,你说得对,我说我们“不能依赖用户”就是这样。 – eternicode 2010-11-11 03:15:32

+0

如果没有请求,则无法检测到域,并且“reverse”或“{%url%}”。其他任何**需要**设置。这很简单。没有理由为此而华而不实。要求设置并完成。 – 2010-11-11 11:03:45

4

为了得到当前站点有对象网站:

如果您没有访问请求对象,你可以使用网站模型的经理 GET_CURRENT()方法。然后您应该 确保您的设置文件包含SITE_ID设置。这 示例等同于前一个:

from django.contrib.sites.models import Site 

def my_function_without_request(): 
    current_site = Site.objects.get_current() 
    if current_site.domain == 'foo.com': 
     # Do something 
     pass 
    else: 
     # Do something else. 
     pass 

更多信息:http://docs.djangoproject.com/en/dev/ref/contrib/sites/

+0

我目前不使用网站框架。看起来它会比仅仅获取当前域的价值更多的工作 - 无论如何都必须手动配置。谢谢你。 – 2010-11-11 00:48:00

+0

我很困惑。这正是网站框架的用途,它使您能够将这些信息设置一次并随时随地使用。在数据库中进行编辑比在设置文件中的编辑要容易得多,正如您所建议的那样。那么究竟是什么问题呢? – 2010-11-11 09:20:02

+2

从站点文档:“如果您的单个Django安装支持多个站点,并且需要以某种方式区分这些站点,请使用它。”这不是一个包含多个网站的项目,所以实施一个模型来存储这些数据对于我的情况来说是矫枉过正的。 – 2010-11-11 12:45:00

相关问题