Los
Los

Reputation: 156

Django 3.x - Custom Error Page is showing a 500 when it should be a 404

UPDATE: Added the code I was accessing that threw the error

For a CS50 project I'm working on with a wiki page, I'm trying to send the right custom 404 error when a user types a page that doesn't exist in wiki/TITLE however when I type a missing page, Django throws a 500 instead of a 404. Is this a common error or did I make my error message wrong? Debug is set to False and Allowed Hosts is configured to ['*'] in settings:

Here's my custom error handlers in views.py:

def error_404(request, exception):
    context = {}
    response = render(request, 'encyclopedia/error_404.html', context=context)
    response.status_code = 404
    return response


def error_500(request):
    context = {}
    response = render(request, 'encyclopedia/error_500.html', context=context)
    response.status_code = 500
    return response

Here's how they are in wiki/urls.py:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include("encyclopedia.urls")),
]

handler404 = "encyclopedia.views.error_404"
handler500 = "encyclopedia.views.error_500"

here's the function in views.py that I'm accessing but going to wiki/C:

#function gets entry from index.html's <li>
def entry_page(request, entry):
    name = entry                     # Places the title       
    print(f"checking the title: {entry}")                            
    text = util.get_entry(entry)     # Grabs the entry using the util function
    html = md_converter(text)  

    if text is not None:
        return render(request, "encyclopedia/entry.html", {
            "title": name,
            "entry": html
        })

And here's my urls.py for good measure:

from django.urls import path

from . import views

app_name = "encyclopedia"
urlpatterns = [
    path("", views.index, name="index"),
    path("wiki/<str:entry>", views.entry_page, name="entry"),
    path("wiki/edit/<str:title>", views.edit, name="edit"),
    path("search", views.search, name="search"),
    path("random", views.random_page, name="random"),
    path("create_entry",views.create_entry, name="create_entry")
]

Here's what the terminal shows (my styles.css is throwing a 404 for some reason but I haven't changed anything there...that's a separate issue): my terminal when I go to a page that isn't there

Upvotes: 0

Views: 2309

Answers (2)

Los
Los

Reputation: 156

Figured it out. Thanks ya'll.

There was an error in the function I was using to grab the page. I wasn't checking to see if the URL was valid when looking up a particular wiki entry.

Changing entry_page in views.py to this made it work!:

def entry_page(request, entry):                              
if entry in util.list_entries():
    name = entry                     # Places the title    
    text = util.get_entry(entry)     # Grabs the entry using the util function
    html = md_converter(text)  
    return render(request, "encyclopedia/entry.html", {
        "title": name,
        "entry": html
    })
else:  
        return render(request, "encyclopedia/error_404.html" )

Glad it wasn't Django messing up, just me lol

Upvotes: 0

kawadhiya21
kawadhiya21

Reputation: 2528

There could be something wrong with your code. Django doc clearly says

The 404 view is also called if Django doesn’t find a match after checking every regular expression in the URLconf.

https://docs.djangoproject.com/en/3.2/ref/views/#error-views

Upvotes: 1

Related Questions