Xử lý lỗi 404 trong Python Django

Nội dung

Bài này sẽ giới thiệu những nội dung sau:

  • Lỗi 404 là gì?
  • Cách trả lỗi 404
  • Custom template 404

Lỗi 404 là gì?

Lỗi 404 trong HTTP là không tìm ra được đường dẫn url. Ví dụ Kteam thử nhập 1 đường dẫn không tồn tại

Django sẽ tự trả về lỗi 404 cho mình. Tuy nhiên ta sẽ gặp vấn đề như sau, ở đường dẫn bài viết mình thử vô một url có id bài viết không tồn tại

Mặc dù đường dẫn url mình nhập vào vẫn đúng theo quy tắc đặt path.Tuy nhiên, hiện tại Blog của mình chỉ có 2 bài viết, nên ở đường dẫn có bài viết id = 12 nó sẽ tạo ra bug ở câu truy vấn. Ta cần phải xử lý ở đây phải trả về 404, không thể quăng lỗi kiểu này cho người dùng được.


Cách trả lỗi 404

Vậy ta để xử lý khi xử lý ở Post với id không tồn tại, Kteam sẽ dùng thêm exception 404 của Django. Ở views.py trong app blog

from django.http import Http404

Sau đó ta thay câu truy vấn như sau

def post(request, id):
    try:
        post = Post.objects.get(id=id)
    except Post.DoesNotExist:
        raise Http404("Bài viết không tồn tại")
    
    return render(request, 'blog/post.html', {'post': post})

Custom template 404

Ở template 404 hiện tại là hiển thị ở chế độ Debug để giúp dân lập trình có thể biết nguyên nhân và tìm ra bug. Còn chúng ta hãy thử xem template 404 ở người dùng

Nhìn nó khá là bình thường, bây giờ Kteam sẽ tạo template mới xử lý 404. Ở template app home, ta tạo thêm 1 template error.html như sau:

{% extends "pages/base.html" %}
 
{% block title %}Error{% endblock %}
 
{% block content %}
<h3>{{message}}</h3>
{% endblock %}

Ta sẽ override hàm xử lý 404 như sau, ở views.py trong app home:

def error(request, exception):
    return render(request, 'pages/error.html', {'message': exception})

Ở urls.py tổng, ta thực hiện như sau:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('home.urls')),
    path('blog/', include('blog.urls')),
]

handler404 = 'home.views.error'

Để hiển thị template này, ta phải tắt chế độ Debug, ta qua setting chuyển biến DEBUG thành false, đồng thời khai báo host cho phép ở server thật. Kteam sẽ đưa kí tự ‘*’ để báo Django là bất kì host nào cũng chấp nhận:

Ta sẽ xem kết quả:

Leave a Reply