Django: получение абсолютного URL без доступа к объекту запроса - PullRequest
17 голосов
/ 11 ноября 2010

У меня есть модель, подобная приведенной ниже.Когда создается экземпляр, я хочу отправить заинтересованному лицу электронное письмо:

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)

Однако вызов reverse возвращает только часть пути URL.Пример: /stops/9/status/.Мне нужен полный URL, такой как http://example.com/stops/9/status/.Как мне получить имя хоста и порт (для тестовых экземпляров, которые не используют порт 80) текущего веб-сайта?

Сначала я хотел сделать это доступным через переменную в settings.py, чтобы я могзатем доступ по мере необходимости.Однако подумал, что у кого-то может быть более убедительное предложение.

Ответы [ 2 ]

4 голосов
/ 11 ноября 2010

Как упоминал yedpodtrzitko, есть фреймворк для сайтов, но, как вы упомянули, это очень ручная настройка.

Требуется настройка в settings.py, но она только немного менее ручная, чем настройка сайтов. (Он может работать как с несколькими доменами, так и с сайтами, и параметр SITE_ID).

Существует идея для замены get_absolute_url , которая облегчит подобные вещи, хотя я думаю, что ее реализация страдает от той же проблемы (как получить домен, схема [http vs https] и т. Д.) .

Я играл с идеей промежуточного программного обеспечения, которое проверяет входящие запросы и создает настройку «наиболее вероятный домен», основанную на частоте значения заголовка HTTP HOST. Или, возможно, он может установить этот параметр для каждого запроса индивидуально, чтобы у вас всегда был доступ к текущему домену. Я не дошел до того, чтобы всерьез заняться этим, но это мысль.

4 голосов
/ 11 ноября 2010

Для получения текущего сайта есть объект Сайт:

Если у вас нет доступа к объекту запроса, вы можете использовать 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/

...