Spostrzeżenie o debuggowaniu Django

Kilka dni temu tłukłem się ze znalezieniem błędu w kodzie aplikacji mojego sajtu. Przez dłuższy czas nie wiedziałem co jest nie tak. Problem był dosyć dziwny. Problem dotyczył aplikacji FlatPages w Django, tak myślałem na początku. Ukończyłem pewien etap i wystawiłem nowa wersję aplikacji aby serwowała moje strony WWW. Oczywiście przy publicznym dostępnie do strony przełączyłem ustawiłem zmienną DEBUG=False w settings.py. Ku mojemu zaskoczeniu wszystkie próby otwarcia stron statycznych, obsługiwanych przez FlatPages kończyły się błędem Http 500. Przy ustawionej zmiennej DEBUG=True wszystko działało jak zakładałem.

W związku z powyższym znalezienie błędu było trochę uciążliwe. Najpierw wypróbowałem sposób podsunięty przez DIrk Ye. Logowanie „traceback’a” (jeśli można tak napisać) do bazy danych jest wygodnym rozwiązanie, lecz nie dawało efektów ponieważ przy obu ustawieniach zmiennej DEBUG logowany był cały czas ten sam błąd. Dopiero po przejrzeniu spisu zmiennych Django znalazłem jedną (DEBUG_PROPAGATE_EXCEPTIONS), która wyglądała interesująco w powiązaniu z moim przypadkiem. Dopisałem linijkę do settings.py mojej aplikacji:

DEBUG_PROPAGATE_EXCEPTIONS = True

Zmiennej należy używać tylko w celach testowych, nigdy w produkcji. Powoduje ona jakby wypchnięcie „tracebakca” na sam wierzch, np. może zostać wyświetlony na stronie. Zmienna została wprowadzona w wersji 1.0 framworka Django. Dzięki temu ustawieniu okazało się, że miałem błąd w szablonie statycznych stron. Usunąłem ten błąd i wszystko jest ok.

Dodatkowa podpowiedź może się przydać. Jeśli chcemy kontrolować treść wyświetlaną na stronie z poziomu szablonu w zależności od ustawienia zmiennej DEBUG to powinniśmy wprowadzić kilka zmian w settings.py.

  1. Dodać do zmiennej TEMPLATE_CONTEXT_PROCESSOR należy dodać:
    'django.core.context_processors.debug'

    czyli np.:

    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.core.context_processors.i18n',
        'django.core.context_processors.auth',
        'django.core.context_processors.debug',
    )
  2. W pliku views.py dodajemy linię:
    from django.template import RequestContext
  3. W kodzie widoku w należy dodać kolejny trzeci argument do funkcji render_to_response:
    return render_to_response(
                                         'template.html',
                                         {'context':context},
                                         context_instance=RequestContext(request)
                                         )

    W takim wypadku mamy do dyspozycji w szablonie dwie zmienne debug i sql_queries.

Więcej w dokumentacji Django.

Autor: grzeszy - 3, Grudzień 2008
Kategoria: Programowanie, Python
Tagi: ,

Skomentuj

Ostatnie wpisy