Postępując zgodnie z samouczkiem znajdującym się tutaj , nie mogę utworzyć niestandardowej strony błędu 500 lub 404. Jeśli wpiszę zły adres URL, strona wyświetli domyślną stronę błędu. Czy jest coś, co powinienem sprawdzić, co uniemożliwiłoby wyświetlenie strony niestandardowej?
Katalogi plików:
mysite/
mysite/
__init__.py
__init__.pyc
settings.py
settings.pyc
urls.py
urls.pyc
wsgi.py
wsgi.pyc
polls/
templates/
admin/
base_site.html
404.html
500.html
polls/
detail.html
index.html
__init__.py
__init__.pyc
admin.py
admin.pyc
models.py
models.pyc
tests.py
urls.py
urls.pyc
view.py
views.pyc
templates/
manage.py
w mysite / settings.py mam te włączone:
DEBUG = False
TEMPLATE_DEBUG = DEBUG
#....
TEMPLATE_DIRS = (
'C:/Users/Me/Django/mysite/templates',
)
w ramach mysite / polls / urls.py:
from django.conf.urls import patterns, url
from polls import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
)
Mogę opublikować inny potrzebny kod, ale co powinienem zmienić, aby uzyskać niestandardową stronę błędu 500, jeśli używam złego adresu URL?
Edytować
ROZWIĄZANIE: Miałem dodatkowy
TEMPLATE_DIRS
w moim settings.py i to było przyczyną problemu
Odpowiedzi:
Pod swoim głównym
views.py
dodaj własną, niestandardową implementację następujących dwóch widoków i po prostu skonfiguruj szablony 404.html i 500.html z tym, co chcesz wyświetlić.Dzięki temu rozwiązaniu nie trzeba dodawać żadnego niestandardowego kodu
urls.py
Oto kod:
Aktualizacja
handler404
ihandler500
są eksportowane zmienne konfiguracyjne ciągów Django znalezione wdjango/conf/urls/__init__.py
. Dlatego powyższa konfiguracja działa.Aby powyższa konfiguracja działała, należy zdefiniować następujące zmienne w swoim
urls.py
pliku i skierować wyeksportowane zmienne Django do ścieżki w języku Python, w której zdefiniowane są te widoki funkcjonalne Django, na przykład:Aktualizacja dla Django 2.0
Podpisy dla widoków obsługi zostały zmienione w Django 2.0: https://docs.djangoproject.com/en/2.0/ref/views/#error-views
Jeśli używasz widoków jak powyżej, program handler404 zakończy się niepowodzeniem z komunikatem:
W takim przypadku zmodyfikuj swoje widoki w ten sposób:
źródło
500 template
nie wyrenderuje się,request.user
ponieważ zgłasza błąd serwera 500, więc serwer nie jest w stanie niczego obsłużyć.Oficjalna odpowiedź:
Oto link do oficjalnej dokumentacji na temat konfigurowania niestandardowych widoków błędów:
https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views
Mówi, aby dodać takie linie w swoim URLconf (ustawienie ich gdziekolwiek indziej nie przyniesie efektu):
Możesz również dostosować widok błędów CSRF, modyfikując ustawienie
CSRF_FAILURE_VIEW
.Domyślne programy obsługi błędów:
Warto czytać dokumentację z obsługą domyślne błędów
page_not_found
,server_error
,permission_denied
ibad_request
. Domyślnie oni korzystać z tych szablonów, czy mogą je znaleźć odpowiednio:404.html
,500.html
,403.html
, i400.html
.Więc jeśli wszystko, co chcesz zrobić, to stworzyć ładne strony błędów, po prostu utwórz te pliki w
TEMPLATE_DIRS
katalogu, nie musisz w ogóle edytować URLConf. Przeczytaj dokumentację, aby zobaczyć, które zmienne kontekstu są dostępne.W Django 1.10 i nowszych domyślny widok błędów CSRF używa szablonu
403_csrf.html
.Mam cię:
Nie zapominaj, że
DEBUG
musi być ustawione na False, aby te działały, w przeciwnym razie zostaną użyte normalne procedury obsługi debugowania.źródło
Dodaj te linie do urls.py
urls.py
i zaimplementuj nasze niestandardowe widoki w views.py.
views.py
źródło
handler400
tylko po to, aby go nadpisaćhandler400 = 'myapp.views.bad_request'
?render_to_response
. Z dokumentacji: „nie jest zalecane i prawdopodobnie zostanie wycofane w przyszłości”.render_to_response
które będzie przestarzałe, zobacz następujące (użyjrender
zamiast tego): stackoverflow.com/questions/44228397/…Ze strony, do której się odwołałeś:
Więc uważam, że musisz dodać coś takiego do swojego urls.py:
i podobne dla handler500.
źródło
urlpatterns = ...
linią dodaj linię z napisemhandler500 = 'views.handle500'
, a następnie dodajdef handle500(request):
do swojego views.py, który wyświetla twój 500.html.Jeśli wszystko, czego potrzebujesz, to pokazać niestandardowe strony, które mają kilka wymyślnych komunikatów o błędach dla Twojej witryny, kiedy
DEBUG = False
, dodaj dwa szablony o nazwach 404.html i 500.html do katalogu szablonów, a te niestandardowe strony będą automatycznie pobierane po 404 lub 500 jest podniesiony.źródło
'DIRS': [os.path.join(BASE_DIR, '<project_name>/templates')]
na liście SZABLONY wsettings.py
.W Django 2. * możesz użyć tej konstrukcji w views.py
W settings.py
W urls.py
Zwykle tworzę default_app i obsługuję błędy całej witryny, w tym procesory kontekstu.
źródło
exception
?locals()
? Plik pokazuje tylkopass
.settings.py:
i po prostu dodaj swoje strony
404.html
i500.html
do folderu szablonów. usuń404.html
i500.html
z szablonów w aplikacji ankiet.źródło
raise Http404('msg')
: stackoverflow.com/a/37109914/895245{{ request_path }}
jest również dostępna.Zrób błąd, na stronie błędu dowiedz się, skąd django ładuje szablony, mam na myśli stos ścieżek. W podstawowym katalogu template_dir dodaj te strony html 500.html , 404.html . W przypadku wystąpienia tych błędów odpowiednie pliki szablonów zostaną automatycznie załadowane.
Możesz także dodać strony dla innych kodów błędów, takich jak 400 i 403 .
Mam nadzieję, że to pomoże !!!
źródło
W Django
3.x
zaakceptowana odpowiedź nie zadziała, ponieważrender_to_response
została całkowicie usunięta, a także wprowadzono więcej zmian od wersji, dla której działała zaakceptowana odpowiedź.Są tam również inne odpowiedzi, ale przedstawiam nieco bardziej przejrzystą odpowiedź:
W głównym
urls.py
pliku:W
yourapp/views.py
pliku:Upewnij się, że zaimportowałeś
render()
doyourapp/views.py
pliku:Uwaga dodatkowa:
render_to_response()
został2.x
uznany za przestarzały w Django i został całkowicie usunięty w wersji3.x
.źródło
Jako jeden wiersz (dla strony ogólnej 404):
źródło
Nie jest wymagany żaden dodatkowy widok. https://docs.djangoproject.com/en/3.0/ref/views/
Po prostu umieść pliki błędów w katalogu głównym szablonów
Powinien również używać strony błędu, gdy debugowanie jest fałszywe
źródło
Działa to na django 2.0
Pamiętaj, aby umieścić swój niestandardowy
404.html
plik w folderze szablonów aplikacji.źródło
Django 3.0
tutaj jest link jak dostosować widoki błędów
tutaj jest link jak renderować widok
w
urls.py
(głównym folderze projektu) umieść:aw tej aplikacji (
my_app_name
) umieśćviews.py
:UWAGA:
error/404.html
to ścieżka, jeśli umieścisz pliki w folderze szablonów projektów (nie aplikacji)templates/errors/404.html
więc umieść pliki tam, gdzie chcesz, i napisz właściwą ścieżkę.UWAGA 2: Jeśli po przeładowaniu strony nadal widzisz stary szablon, zmień go
settings.py
DEBUG=True
, zapisz, a następnie ponownie doFalse
(aby zrestartować serwer i zebrać nowe pliki).źródło
DEUB=False
plików statycznych, mogą nie być obsługiwane, przez co nie możesz wyświetlić podglądu zmian niestandardowego szablonu błędu. Użyj,./manage.py runserver --insecure
by i tak zmusić django do obsługi.Spróbuj przenieść szablony błędów do
.../Django/mysite/templates/
?Jestem pewien co do tego, ale myślę, że muszą one być „globalne” dla witryny.
źródło