Xử lý lỗi 404 trong Python Django

Lập trình web với Python bằng Django

3.5 (2 đánh giá)
Tạo bởi Kteam Cập nhật lần cuối 21:02 23-11-2019 11.505 lượt xem 6 bình luận
Học nhanh

Danh sách bài học

Xử lý lỗi 404 trong Python Django

Ghi chú

Nội dung bài viết bạn đang xem được update từ tháng 06/2019. Vì vậy sẽ có đôi chút khác biệt giữ VIDEO và NỘI DUNG BÀI VIẾT.

Chúng ta sẽ có nhiều cập nhập hơn về cả bài viết lẫn video trong thời gian tới. Nhớ like/ share hoặc đánh giá 5 sao để Kteam có động lực nhé! 

Cảm ơn các bạn! 


Dẫn nhập

Ở bài trước, Kteam đã hướng dẫn các bạn xong cách LOẠI BỎ HARDCODED URL TRONG PYTHON DJANGO.

Trong bài này Kteam sẽ hướng dẫn cho các bạn cách xử lý lỗi 404 trong Python Django.


Nội dung

Để theo dõi bài này tốt nhất, bạn nên xem qua bài:

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ả:


Kết

Như vậy Kteam đã hướng dẫn các bạn xong cách xử lý lỗi 404 trong Python Django.

Ở bài tiếp theo, Kteam sẽ giới thiệu cho các bạn DJANGO SỬ DỤNG MÔ HÌNH MVC.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

Khóa học

Lập trình web với Python bằng Django

Lập trình web với Python bằng Django

Đánh giá

HuyIT đã đánh giá 14:40 09-04-2020

tuanna đã đánh giá 11:15 03-03-2020

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
qkhanhnguyen đã bình luận 18:00 20-06-2020

nếu dùng: 

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})

VSCode: Class 'Post' has no 'DoesNotExist' member 

nếu dùng code trên phải fix thế nào mọi người?

dangdinhchung đã bình luận 22:15 11-12-2019

a cho e hỏi ở chỗ :  urls.py tổng

handler404 = 'home.views.error' mình chưa import thì xao hiểu được anh nhỉ, e đang bị error chỗ đó anh ạ

?: (urls.E007) The custom handler404 view 'home.views.error' does not take the correct number of arguments (request, exception).

 

Không có video.