2010-11-10 28 views
15

Mam taki model jak ten poniżej. Gdy instancja jest tworzona, chcę, aby wysłać e-mail do zainteresowanej strony:Django: Uzyskiwanie bezwzględnego adresu URL bez dostępu do obiektu żądania

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) 

Jednak wywołanie reverse zwraca tylko część ścieżki URL. Przykład: /stops/9/status/. Potrzebuję pełnego adresu URL, takiego jak http://example.com/stops/9/status/. W jaki sposób chciałbym pobrać nazwę hosta i port (dla instancji testowych, które nie korzystają z portu 80) bieżącej witryny internetowej?

Moja początkowa myśl polegała na udostępnieniu tej zmiennej za pomocą zmiennej w settings.py, którą wówczas mógłbym uzyskać w razie potrzeby. Jednak myślę, że ktoś może mieć bardziej zdecydowaną sugestię.

Odpowiedz

4

Jest ramy witryn, jak yedpodtrzitko wspomniano, ale, jak już wspomniano, jest to bardzo dużo ręcznej konfiguracji.

Wymagane jest ustawienie w pliku settings.py, ale jest to tylko trochę mniej instrukcji niż konfigurowanie witryn. (Może obsługiwać wiele domen, tak samo dobrze jak witryny i ustawienia SITE_ID).

Istnieje pomysł na replacing get_absolute_url, który sprawiłby, że takie rzeczy byłyby łatwiejsze, chociaż myślę, że jego implementacja cierpi na ten sam problem (jak uzyskać domenę, schemat [http vs https], itp.).

Zaczynałem od pomysłu oprogramowania pośredniego, które analizuje przychodzące żądania i konstruuje "najbardziej prawdopodobną domenę" jakiegoś rodzaju w oparciu o częstotliwość nagłówka HTTP HOST. Lub może ustawić to ustawienie dla każdego żądania indywidualnie, więc zawsze możesz mieć obecną domenę do pracy. Nie doszłam do tego, żeby poważnie się temu przyglądać, ale jest to myśl.

+0

"jeśli nie zadają sobie trudu, aby to ustawić, moja aplikacja nie będzie dla nich pracowała", ale to nie jest pomocne "? Jak możesz zadzwonić podając" wymaganie ", aby być" nie pomocne "? Jest to łatwe wymaganie To musi być ustawione w ustawieniach i na tym koniec .Dużo Django wymaga ustawień lub nie działa Dlaczego aplikacja ma być "magiczna" i nie wymaga ustawień? Jeśli nie możesz polegać na użytkownik, a następnie, oni będą robić coś innego, aby obalić aplikację również, prawda? Jak zmienić kod.Po prostu podaj wymagane ustawienia i gotowe. Nie gofruj. –

+0

To prawda, ale miałem na myśli, że nie jest to pomocne w naszej obecnej dyskusji na temat niezawodnej metody wykrywania domen. Masz jednak rację, to głupio mówić, że "nie możemy polegać na użytkowniku". – eternicode

+0

Nie można wykryć domeny bez żądania i 'reverse' lub' {% url%} '. Wszystko inne ** wymaga ** ustawienia. To proste. Nie ma powodu do gofrowania. Wymagaj ustawienia i gotowe. –

4

Dla uzyskania aktualnej strony istnieje obiekt strony:

Jeśli nie masz dostępu do obiektu żądania, można użyć metody get_current() kierownika modelu oddziału. Powinieneś wtedy upewnić się, że twój plik ustawień zawiera ustawienie SITE_ID. Ten przykładem jest równoważna poprzedniej:

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 

Więcej informacji: http://docs.djangoproject.com/en/dev/ref/contrib/sites/

+0

Obecnie nie używam frameworka witryn. Wygląda na to, że będzie to więcej pracy niż to, co warto, aby uzyskać bieżącą domenę - i tak trzeba ją skonfigurować ręcznie. Ale dziękuję. –

+0

Jestem zdezorientowany. Właśnie do tego służy struktura serwisów i daje możliwość jednorazowego ustawienia tych informacji i udostępnienia ich wszędzie. Znacznie łatwiej jest edytować, gdy jest w DB, jak sugerowałeś, w pliku ustawień. Więc jaki jest dokładnie problem? –

+2

Z dokumentacji witryn: "Użyj go, jeśli twoja pojedyncza instalacja Django obsługuje więcej niż jedną witrynę i musisz w jakiś sposób rozróżnić te witryny.". To nie jest projekt z wieloma stronami internetowymi, więc imho, wdrożenie modelu do przechowywania tych danych jest przesadzone w mojej sytuacji. –

Powiązane problemy