#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 Я вроде как предположил, что это было некоторым упрощением для целей этого вопроса, но, возможно, нет…