Обработка ошибок 404/500 в Django

#django #http-status-code-404

#django #http-status-code-404

Вопрос:

Есть небольшая проблема с моим приложением Django: мой проект представляет собой блог с несколькими постами. Вы можете получить доступ к первому сообщению, набрав localhost:8000/blog/post/1 в строке URL. Прочитать сообщение нет. X вы должны ввести localhost:8000/blog/post/X . Итак, мне нужно отобразить пользовательскую страницу «Ошибка 404» при запросе несуществующей записи (например localhost:8000/blog/post/32 , если доступно только 3 записи). Проблема в том, что вместо выдачи ошибки 404 она выдает ошибку Server Error (500), однако я никогда не кодировал что-либо для выдачи такого рода ошибок. Вот соответствующие части кода, но не мой полный код, который я считаю бесполезным. Название проекта — red_pillers , название приложения — blog .

в red_pillers/settings.py

 DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']
  

red_pillers/urls.py

 from django.contrib import admin
from django.urls import path, re_path, include
from django.conf.urls import handler404

from . import views

handler404 = 'red_pillers.views.handler404'

urlpatterns = [
    re_path('^blog/', include('blog.urls')),
    re_path('^$', views.home),
    re_path('^admin/', admin.site.urls),
]
  

red_pillers/views.py

 from django.shortcuts import render

def home(request):
    return render(request, 'home.html')


def handler404(request):
    return render(request, 'errors/404.html', {}, status=404)
  

blog/pycode/post.py

 from django.http import Http404

class Post:

    POSTS = [
        {'id': 1, 'title': 'First Post', 'body': 'This is my first post'},
        {'id': 2, 'title': 'Second Post', 'body': 'This is my second post'},
        {'id': 3, 'title': 'Third Post', 'body': 'This is my third post'},
    ]

    @classmethod
    def all(cls):
        return cls.POSTS

    @classmethod
    def find(cls, id):
        try:
            return cls.POSTS[int(id) - 1]
        except:
            raise Http404('Error 404...')
  

РЕДАКТИРОВАТЬ: добавлено больше кода

blog/urls.py

 from django.urls import path, re_path

from . import views

urlpatterns = [
    re_path('^$', views.index),
    re_path('^posts/(?P<id>[0-9] )$', views.show),
]
  

blog/views.py

 from django.shortcuts import render

from .pycode.post import Post

def index(request):
    posts = Post.all()
    return render(request, 'blog/index.html', {'posts': posts})


def show(request, id):
    post = Post.find(id)
    return render(request, 'blog/show.html', {'post': post})
  

Комментарии:

1. если у вас ошибка 500, покажите нам полную трассировку ошибок. вы получаете ошибку 500, если ваш код сталкивается с ошибкой python. Обратите внимание, что ваше home представление не выполняет ничего, кроме рендеринга home.html (он не используется Post ), поэтому, если в home.html это не может вызвать ошибку. Вы не показываете нам никакого соответствующего кода, потому что ни один из показанных вами здесь кодов не имеет ничего общего с выборкой URL / blog / post / 32.

2. Я добавил больше кода, не могли бы вы взглянуть, пожалуйста?

3. И как я могу показать вам полную трассировку ошибок? в терминале ничего нет…

4. Там, где вы это сделали manage.py runserver , вы должны увидеть подробные журналы ошибок.

5. Просто [30/Mar/2019 15:55:45] "GET /blog/posts/4 HTTP/1.1" 500 27

Ответ №1:

Используйте get_object_or_404, который перенаправит вас, если он не существует.

Комментарии:

1. куда мне нужно это поместить?

2. Вы должны импортировать его везде, где хотите получить доступ к записи. Если вы нажмете на ссылку, там будет пример.

3. это для извлечения объектов из базы данных, чего, по-видимому, вы не делаете, поскольку кажется, что вы жестко кодируете свои сообщения в самом коде (я бы настоятельно не советовал этого делать, но это не связано с этим вопросом)

4. @dirkgroten Я вроде как предположил, что это было некоторым упрощением для целей этого вопроса, но, возможно, нет…