自定义

直接在项目templates目录下添加400.html、403.html、404.html、500.html,其他什么都不用管。

当前我自己写的404的页面是这样的

源码是:

样式那些都写到一个文件里面了,直接复制过去就可以用

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>404</title>


 <style> html,body {
     height: 100%; min-height: 450px; font-size: 32px; font-weight: 500; color: #5d7399; margin:0;padding:0;border:0; } .content {
     height: 100%; position: relative; z-index: 1; background-color: #d2e1ec; background-image: -webkit-linear-gradient(top, #bbcfe1 0%, #e8f2f6 80%); background-image: linear-gradient(to bottom, #bbcfe1 0%, #e8f2f6 80%); overflow: hidden; } .snow {
     position: absolute; top: 0; left: 0; pointer-events: none; z-index: 20; } .main-text {
     padding: 20vh 20px 0 20px; text-align: center; line-height: 2em; font-size: 5vh; } .main-text h1 {
     font-size:45px; line-height:48px; margin:0; padding:0;} .main-text-a{
     height:32px; margin-left:auto; margin-right:auto; text-align:center; } .main-text-a a {
     font-size:16px; text-decoration:none; color:#0066CC; } .main-text-a a:hover{
     color:#000; } .home-link {
     font-size: 0.6em; font-weight: 400; color: inherit; text-decoration: none; opacity: 0.6; border-bottom: 1px dashed rgba(93, 115, 153, 0.5); } .home-link:hover {
     opacity: 1; } .ground {
     height: 160px; width: 100%; position: absolute; bottom: 0; left: 0; background: #f6f9fa; box-shadow: 0 0 10px 10px #f6f9fa; } .ground:before, .ground:after {
     content: ''; display: block; width: 250px; height: 250px; position: absolute; top: -62.5px; z-index: -1; background: transparent; -webkit-transform: scaleX(0.2) rotate(45deg); transform: scaleX(0.2) rotate(45deg); } .ground:after {
     left: 50%; margin-left: -166.66667px; box-shadow: -340px 260px 15px #8193b2, -620px 580px 15px #8193b2, -900px 900px 15px #b0bccf, -1155px 1245px 15px #b4bed1, -1515px 1485px 15px #8193b2, -1755px 1845px 15px #8a9bb8, -2050px 2150px 15px #91a1bc, -2425px 2375px 15px #bac4d5, -2695px 2705px 15px #a1aec6, -3020px 2980px 15px #8193b2, -3315px 3285px 15px #94a3be, -3555px 3645px 15px #9aa9c2, -3910px 3890px 15px #b0bccf, -4180px 4220px 15px #bac4d5, -4535px 4465px 15px #a7b4c9, -4840px 4760px 15px #94a3be; } .ground:before {
     right: 50%; margin-right: -166.66667px; box-shadow: 325px -275px 15px #b4bed1, 620px -580px 15px #adb9cd, 925px -875px 15px #a1aec6, 1220px -1180px 15px #b7c1d3, 1545px -1455px 15px #7e90b0, 1795px -1805px 15px #b0bccf, 2080px -2120px 15px #b7c1d3, 2395px -2405px 15px #8e9eba, 2730px -2670px 15px #b7c1d3, 2995px -3005px 15px #9dabc4, 3285px -3315px 15px #a1aec6, 3620px -3580px 15px #8193b2, 3880px -3920px 15px #aab6cb, 4225px -4175px 15px #9dabc4, 4510px -4490px 15px #8e9eba, 4785px -4815px 15px #a7b4c9; } .mound {
     margin-top: -80px; font-weight: 800; font-size: 180px; text-align: center; color: #dd4040; pointer-events: none; } .mound:before {
     content: ''; display: block; width: 600px; height: 200px; position: absolute; left: 50%; margin-left: -300px; top: 50px; z-index: 1; border-radius: 100%; background-color: #e8f2f6; background-image: -webkit-linear-gradient(top, #dee8f1, #f6f9fa 60px); background-image: linear-gradient(to bottom, #dee8f1, #f6f9fa 60px); } .mound:after {
     content: ''; display: block; width: 28px; height: 6px; position: absolute; left: 50%; margin-left: -150px; top: 68px; z-index: 2; background: #dd4040; border-radius: 100%; -webkit-transform: rotate(-15deg); transform: rotate(-15deg); box-shadow: -56px 12px 0 1px #dd4040, -126px 6px 0 2px #dd4040, -196px 24px 0 3px #dd4040; } .mound_text {
     -webkit-transform: rotate(6deg); transform: rotate(6deg); } .mound_spade {
     display: block; width: 35px; height: 30px; position: absolute; right: 50%; top: 42%; margin-right: -250px; z-index: 0; -webkit-transform: rotate(35deg); transform: rotate(35deg); background: #dd4040; } .mound_spade:before, .mound_spade:after {
     content: ''; display: block; position: absolute; } .mound_spade:before {
     width: 40%; height: 30px; bottom: 98%; left: 50%; margin-left: -20%; background: #dd4040; } .mound_spade:after {
     width: 100%; height: 30px; top: -55px; left: 0%; box-sizing: border-box; border: 10px solid #dd4040; border-radius: 4px 4px 20px 20px; } </style>

</head>

<body translate="no"> 
<div class="content">
  <canvas class="snow" id="snow" width="1349" height="400"></canvas>
  <div class="main-text">
    <h6>抱歉!<br>页面找不到了,请输入正确的网址!</h6>
	<div class="main-text-a"><a href="{% url 'homepage' %}">< 返回首页</a></div>
  </div>
  <div class="ground">
    <div class="mound"> 
      <div class="mound_text">404 </div>
      <div class="mound_spade"></div> 
    </div>
  </div>
</div>

  
    <script> (function() {
     function ready(fn) {
     if (document.readyState != 'loading'){
     fn(); } else {
     document.addEventListener('DOMContentLoaded', fn); } } function makeSnow(el) {
     var ctx = el.getContext('2d'); var width = 0; var height = 0; var particles = []; var Particle = function() {
     this.x = this.y = this.dx = this.dy = 0; this.reset(); } Particle.prototype.reset = function() {
     this.y = Math.random() * height; this.x = Math.random() * width; this.dx = (Math.random() * 1) - 0.5; this.dy = (Math.random() * 0.5) + 0.5; } function createParticles(count) {
     if (count != particles.length) {
     particles = []; for (var i = 0; i < count; i++) {
     particles.push(new Particle()); } } } function onResize() {
     width = window.innerWidth; height = window.innerHeight; el.width = width; el.height = height; createParticles((width * height) / 10000); } function updateParticles() {
     ctx.clearRect(0, 0, width, height); ctx.fillStyle = '#f6f9fa'; particles.forEach(function(particle) {
     particle.y += particle.dy; particle.x += particle.dx; if (particle.y > height) {
     particle.y = 0; } if (particle.x > width) {
     particle.reset(); particle.y = 0; } ctx.beginPath(); ctx.arc(particle.x, particle.y, 5, 0, Math.PI * 2, false); ctx.fill(); }); window.requestAnimationFrame(updateParticles); } onResize(); updateParticles(); } ready(function() {
     var canvas = document.getElementById('snow'); makeSnow(canvas); }); })(); </script>
</body>
</html>

为什么一步就可以实现

因为django帮我们写好了视图函数:django\views\defaults.py

以下是defaults.py源码:

from django import http
from django.template import Context, Engine, TemplateDoesNotExist, loader
from django.utils import six
from django.utils.encoding import force_text
from django.utils.http import urlquote
from django.views.decorators.csrf import requires_csrf_token
 
ERROR_404_TEMPLATE_NAME = '404.html'
ERROR_403_TEMPLATE_NAME = '403.html'
ERROR_400_TEMPLATE_NAME = '400.html'
ERROR_500_TEMPLATE_NAME = '500.html'
 
 
# This can be called when CsrfViewMiddleware.process_view has not run,
# therefore need @requires_csrf_token in case the template needs
# {% csrf_token %}.
@requires_csrf_token
def page_not_found(request, exception, template_name=ERROR_404_TEMPLATE_NAME):
    """ Default 404 handler. Templates: :template:`404.html` Context: request_path The path of the requested URL (e.g., '/app/pages/bad_page/'). It's quoted to prevent a content injection attack. exception The message from the exception which triggered the 404 (if one was supplied), or the exception class name """
    exception_repr = exception.__class__.__name__
    # Try to get an "interesting" exception message, if any (and not the ugly
    # Resolver404 dictionary)
    try:
        message = exception.args[0]
    except (AttributeError, IndexError):
        pass
    else:
        if isinstance(message, six.text_type):
            exception_repr = message
    context = {
   
        'request_path': urlquote(request.path),
        'exception': exception_repr,
    }
    try:
        template = loader.get_template(template_name)
        body = template.render(context, request)
        content_type = None             # Django will use DEFAULT_CONTENT_TYPE
    except TemplateDoesNotExist:
        if template_name != ERROR_404_TEMPLATE_NAME:
            # Reraise if it's a missing custom template.
            raise
        template = Engine().from_string(
            '<h1>Not Found</h1>'
            '<p>The requested resource was not found on this server.</p>')
        body = template.render(Context(context))
        content_type = 'text/html'
    return http.HttpResponseNotFound(body, content_type=content_type)
 
 
@requires_csrf_token
def server_error(request, template_name=ERROR_500_TEMPLATE_NAME):
    """ 500 error handler. Templates: :template:`500.html` Context: None """
    try:
        template = loader.get_template(template_name)
    except TemplateDoesNotExist:
        if template_name != ERROR_500_TEMPLATE_NAME:
            # Reraise if it's a missing custom template.
            raise
        return http.HttpResponseServerError('<h1>Server Error (500)</h1>', content_type='text/html')
    return http.HttpResponseServerError(template.render())
 
 
@requires_csrf_token
def bad_request(request, exception, template_name=ERROR_400_TEMPLATE_NAME):
    """ 400 error handler. Templates: :template:`400.html` Context: None """
    try:
        template = loader.get_template(template_name)
    except TemplateDoesNotExist:
        if template_name != ERROR_400_TEMPLATE_NAME:
            # Reraise if it's a missing custom template.
            raise
        return http.HttpResponseBadRequest('<h1>Bad Request (400)</h1>', content_type='text/html')
    # No exception content is passed to the template, to not disclose any sensitive information.
    return http.HttpResponseBadRequest(template.render())
 
 
# This can be called when CsrfViewMiddleware.process_view has not run,
# therefore need @requires_csrf_token in case the template needs
# {% csrf_token %}.
@requires_csrf_token
def permission_denied(request, exception, template_name=ERROR_403_TEMPLATE_NAME):
    """ Permission denied (403) handler. Templates: :template:`403.html` Context: None If the template does not exist, an Http403 response containing the text "403 Forbidden" (as per RFC 7231) will be returned. """
    try:
        template = loader.get_template(template_name)
    except TemplateDoesNotExist:
        if template_name != ERROR_403_TEMPLATE_NAME:
            # Reraise if it's a missing custom template.
            raise
        return http.HttpResponseForbidden('<h1>403 Forbidden</h1>', content_type='text/html')
    return http.HttpResponseForbidden(
        template.render(request=request, context={
   'exception': force_text(exception)})
    )