Routing

Our Controller is built without knowing anything about its future URL. Why so?

  1. Because Django already has an amazing URL routing system and we don’t need to duplicate it

  2. Because all controllers might be used in multiple URLs, for example in /api/v1/ and /api/v2/. Our design allows any possible customizations

Run result

$ curl http://127.0.0.1:8000/api/user/ -X POST -d '{"email": "user@wms.org"}' -H 'Content-Type: application/json' -H 'X-API-Consumer: my-api'
{"email":"user@wms.org","uid":"a0c323b9-976a-4b4e-b621-2184434dea56"}

Note

If you want to parse path parameters, see Path parameters and dmr.components.Path.

Handling 404 errors

By default, Django returns HTML 404 pages. This is not what we want for API endpoints. Instead, we want to return API responses with proper error structure and content negotiation (e.g. JSON or XML based on the Accept header).

But, we still want HTML 404 pages for non API views.

Important

Overriding django.conf.urls.handler404 has no effect while DEBUG = True is set.

This is how Django behaves: https://docs.djangoproject.com/en/stable/ref/views/#the-404-page-not-found-view

To achieve this, you can use build_404_handler() helper. It creates a handler that returns API-style 404 responses for specific path prefixes (using the same serializer and renderers as your API), and falls back to Django’s default handler for everything else.

Here is how you can use it in your root urls.py (in your ROOT_URLCONF):

Run result

$ curl http://127.0.0.1:8000/api/user/ -X POST -d '{"email": "correct@example.com"}' -H 'Content-Type: application/json'
{"email":"correct@example.com"}

$ curl http://127.0.0.1:8000/api/wrong/ -D - -X POST -d '{"email": "correct@old-domain.com"}' -H 'Content-Type: application/json'
HTTP/1.1 404 Not Found
date: Tue, 14 Apr 2026 17:09:05 GMT
server: uvicorn
Content-Type: text/html; charset=utf-8
X-Frame-Options: DENY
Vary: Accept-Language
Content-Language: en
Content-Length: 2311
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin

<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>Page not found at /api/wrong/</title>
  <meta name="robots" content="NONE,NOARCHIVE">
  <style>
    html * { padding:0; margin:0; }
    body * { padding:10px 20px; }
    body * * { padding:0; }
    body { font-family: sans-serif; background:#eee; color:#000; }
    body > :where(header, main, footer) { border-bottom:1px solid #ddd; }
    h1 { font-weight:normal; margin-bottom:.4em; }
    h1 small { font-size:60%; color:#666; font-weight:normal; }
    table { border:none; border-collapse: collapse; width:100%; }
    td, th { vertical-align:top; padding:2px 3px; }
    th { width:12em; text-align:right; color:#666; padding-right:.5em; }
    #info { background:#f6f6f6; }
    #info ol { margin: 0.5em 4em; }
    #info ol li { font-family: monospace; }
    #summary { background: #ffc; }
    #explanation { background:#eee; border-bottom: 0px none; }
    pre.exception_value { font-family: sans-serif; color: #575757; font-size: 1.5em; margin: 10px 0 10px 0; }
  </style>
</head>
<body>
  <header id="summary">
    <h1>Page not found <small>(404)</small></h1>
    
    <table class="meta">
      <tr>
        <th scope="row">Request Method:</th>
        <td>POST</td>
      </tr>
      <tr>
        <th scope="row">Request URL:</th>
        <td>http://127.0.0.1:36285/api/wrong/</td>
      </tr>
      
    </table>
  </header>

  <main id="info">
    
      <p>
      Using the URLconf defined in <code>url_conf</code>,
      Django tried these URL patterns, in this order:
      </p>
      <ol>
        
          <li>
            
              <code>
                api/
                
              </code>
            
              <code>
                user/
                [name='users']
              </code>
            
          </li>
        
      </ol>
      <p>
        
          The current path, <code>api/wrong/</code>,
        
        didn’t match any of these.
      </p>
    
  </main>

  <footer id="explanation">
    <p>
      You’re seeing this error because you have <code>DEBUG = True</code> in
      your Django settings file. Change that to <code>False</code>, and Django
      will display a standard 404 page.
    </p>
  </footer>
</body>
</html>

This returns json responses for api/ prefixed paths. But, will still return regular Django HTML responses for any other path.

Handling 500 errors

By default, Django returns HTML 500 pages. This is not what we want for API endpoints. Instead, we want to return API responses with proper error structure and content negotiation (e.g. JSON or XML based on the Accept header).

But, we still want HTML 500 pages for non API views.

Important

Overriding django.conf.urls.handler500 has no effect while DEBUG = True is set.

This is how Django behaves: https://docs.djangoproject.com/en/stable/ref/views/#the-500-server-error-view

To achieve this, you can use build_500_handler() helper. It creates a handler that returns API-style 500 responses for specific path prefixes (using the same serializer and renderers as your API), and falls back to Django’s default handler for everything else.

Here is how you can use it in your root urls.py (in your ROOT_URLCONF):

Run result

$ curl http://127.0.0.1:8000/api/user/ -X POST -d '{"email": "correct@example.com"}' -H 'Content-Type: application/json'
{"email":"correct@example.com"}

$ curl http://127.0.0.1:8000/api/user/ -D - -X POST -d '{"email": "correct@old-domain.com"}' -H 'Content-Type: application/json'
HTTP/1.1 500 Internal Server Error
date: Tue, 14 Apr 2026 17:09:05 GMT
server: uvicorn
Content-Type: text/html; charset=utf-8
X-Frame-Options: DENY
Vary: Accept-Language, Cookie
Content-Language: en
Content-Length: 75166
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin

<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="robots" content="NONE,NOARCHIVE">
  <title>RuntimeError
          at /api/user/</title>
  <style>
    html * { padding:0; margin:0; }
    body * { padding:10px 20px; }
    body * * { padding:0; }
    body { font-family: sans-serif; background-color:#fff; color:#000; }
    body > :where(header, main, footer) { border-bottom:1px solid #ddd; }
    h1 { font-weight:normal; }
    h2 { margin-bottom:.8em; }
    h3 { margin:1em 0 .5em 0; }
    h4 { margin:0 0 .5em 0; font-weight: normal; }
    code, pre { font-size: 100%; white-space: pre-wrap; word-break: break-word; }
    summary { cursor: pointer; }
    table { border:1px solid #ccc; border-collapse: collapse; width:100%; background:white; }
    tbody td, tbody th { vertical-align:top; padding:2px 3px; }
    thead th {
      padding:1px 6px 1px 3px; background:#fefefe; text-align:left;
      font-weight:normal; font-size: 0.6875rem; border:1px solid #ddd;
    }
    tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }
    table.vars { margin:5px 10px 2px 40px; width: auto; }
    table.vars td, table.req td { font-family:monospace; }
    table td.code { width:100%; }
    table td.code pre { overflow:hidden; }
    table.source th { color:#666; }
    table.source td { font-family:monospace; white-space:pre; border-bottom:1px solid #eee; }
    ul.traceback { list-style-type:none; color: #222; }
    ul.traceback li.cause { word-break: break-word; }
    ul.traceback li.frame { padding-bottom:1em; color:#4f4f4f; }
    ul.traceback li.user { background-color:#e0e0e0; color:#000 }
    div.context { padding:10px 0; overflow:hidden; }
    div.context ol { padding-left:30px; margin:0 10px; list-style-position: inside; }
    div.context ol li { font-family:monospace; white-space:pre; color:#777; cursor:pointer; padding-left: 2px; }
    div.context ol li pre { display:inline; }
    div.context ol.context-line li { color:#464646; background-color:#dfdfdf; padding: 3px 2px; }
    div.context ol.context-line li span { position:absolute; right:32px; }
    .user div.context ol.context-line li { background-color:#bbb; color:#000; }
    .user div.context ol li { color:#666; }
    div.commands, summary.commands { margin-left: 40px; }
    div.commands a, summary.commands { color:#555; text-decoration:none; }
    .user div.commands a { color: black; }
    #summary { background: #ffc; }
    #summary h2 { font-weight: normal; color: #666; }
    #info { padding: 0; }
    #info > * { padding:10px 20px; }
    #explanation { background:#eee; }
    #template, #template-not-exist { background:#f6f6f6; }
    #template-not-exist ul { margin: 0 0 10px 20px; }
    #template-not-exist .postmortem-section { margin-bottom: 3px; }
    #unicode-hint { background:#eee; }
    #traceback { background:#eee; }
    #requestinfo { background:#f6f6f6; padding-left:120px; }
    #summary table { border:none; background:transparent; }
    #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }
    #requestinfo h3 { margin-bottom:-1em; }
    .error { background: #ffc; }
    .specific { color:#cc3300; font-weight:bold; }
    h2 span.commands { font-size: 0.7rem; font-weight:normal; }
    span.commands a:link {color:#5E5694;}
    pre.exception_value { font-family: sans-serif; color: #575757; font-size: 1.5rem; margin: 10px 0 10px 0; }
    .append-bottom { margin-bottom: 10px; }
    .fname { user-select: all; }
  </style>
  
  <script>
    function hideAll(elems) {
      for (var e = 0; e < elems.length; e++) {
        elems[e].style.display = 'none';
      }
    }
    window.onload = function() {
      hideAll(document.querySelectorAll('ol.pre-context'));
      hideAll(document.querySelectorAll('ol.post-context'));
      hideAll(document.querySelectorAll('div.pastebin'));
    }
    function toggle() {
      for (var i = 0; i < arguments.length; i++) {
        var e = document.getElementById(arguments[i]);
        if (e) {
          e.style.display = e.style.display == 'none' ? 'block': 'none';
        }
      }
      return false;
    }
    function switchPastebinFriendly(link) {
      s1 = "Switch to copy-and-paste view";
      s2 = "Switch back to interactive view";
      link.textContent = link.textContent.trim() == s1 ? s2: s1;
      toggle('browserTraceback', 'pastebinTraceback');
      return false;
    }
  </script>
  
</head>
<body>
<header id="summary">
  <h1>RuntimeError
       at /api/user/</h1>
  <pre class="exception_value">This error will be handled by handler500</pre>
  <table class="meta">

    <tr>
      <th scope="row">Request Method:</th>
      <td>POST</td>
    </tr>
    <tr>
      <th scope="row">Request URL:</th>
      <td>http://127.0.0.1:36887/api/user/</td>
    </tr>

    <tr>
      <th scope="row">Django Version:</th>
      <td>5.2.13</td>
    </tr>

    <tr>
      <th scope="row">Exception Type:</th>
      <td>RuntimeError</td>
    </tr>


    <tr>
      <th scope="row">Exception Value:</th>
      <td><pre>This error will be handled by handler500</pre></td>
    </tr>


    <tr>
      <th scope="row">Exception Location:</th>
      <td><span class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/docs/examples/routing/handler500.py</span>, line 16, in post</td>
    </tr>


    <tr>
      <th scope="row">Raised during:</th>
      <td>examples.routing.handler500.UserController</td>
    </tr>

    <tr>
      <th scope="row">Python Executable:</th>
      <td>/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/envs/0.7.0/bin/python</td>
    </tr>
    <tr>
      <th scope="row">Python Version:</th>
      <td>3.12.10</td>
    </tr>
    <tr>
      <th scope="row">Python Path:</th>
      <td><pre><code>[&#x27;/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0&#x27;,
 &#x27;/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/django_test_app&#x27;,
 &#x27;/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/docs&#x27;,
 &#x27;/home/docs/.asdf/installs/python/3.12.10/lib/python312.zip&#x27;,
 &#x27;/home/docs/.asdf/installs/python/3.12.10/lib/python3.12&#x27;,
 &#x27;/home/docs/.asdf/installs/python/3.12.10/lib/python3.12/lib-dynload&#x27;,
 &#x27;/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/envs/0.7.0/lib/python3.12/site-packages&#x27;]</code></pre></td>
    </tr>
    <tr>
      <th scope="row">Server time:</th>
      <td>Tue, 14 Apr 2026 12:09:05 -0500</td>
    </tr>
  </table>
</header>

<main id="info">




<div id="traceback">
  <h2>Traceback <span class="commands"><a href="#" role="button" onclick="return switchPastebinFriendly(this);">
    Switch to copy-and-paste view</a></span>
  </h2>
  <div id="browserTraceback">
    <ul class="traceback">
      
        
        <li class="frame django">
          
            <code class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/envs/0.7.0/lib/python3.12/site-packages/django/core/handlers/exception.py</code>, line 42, in inner
          

          
            <div class="context" id="c140501899110208">
              
                <ol start="35" class="pre-context" id="pre140501899110208">
                
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>    can rely on getting a response instead of an exception.</pre></li>
                
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>    &quot;&quot;&quot;</pre></li>
                
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>    if iscoroutinefunction(get_response):</pre></li>
                
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre></pre></li>
                
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>        @wraps(get_response)</pre></li>
                
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>        async def inner(request):</pre></li>
                
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>            try:</pre></li>
                
                </ol>
              
              <ol start="42" class="context-line">
                <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>                response = await get_response(request)
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^</pre> <span>…</span></li>
              </ol>
              
                <ol start='43' class="post-context" id="post140501899110208">
                  
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>            except Exception as exc:</pre></li>
                  
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>                response = await sync_to_async(</pre></li>
                  
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>                    response_for_exception, thread_sensitive=False</pre></li>
                  
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>                )(request, exc)</pre></li>
                  
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre>            return response</pre></li>
                  
                  <li onclick="toggle('pre140501899110208', 'post140501899110208')"><pre></pre></li>
                  
              </ol>
              
            </div>
          

          
            
              <details>
                <summary class="commands">Local vars</summary>
            
            <table class="vars" id="v140501899110208">
              <thead>
                <tr>
                  <th scope="col">Variable</th>
                  <th scope="col">Value</th>
                </tr>
              </thead>
              <tbody>
                
                  <tr>
                    <td>exc</td>
                    <td class="code"><pre>RuntimeError(&#x27;This error will be handled by handler500&#x27;)</pre></td>
                  </tr>
                
                  <tr>
                    <td>get_response</td>
                    <td class="code"><pre>&lt;bound method BaseHandler._get_response_async of &lt;django.core.handlers.asgi.ASGIHandler object at 0x7fc925d68b90&gt;&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>request</td>
                    <td class="code"><pre>&lt;ASGIRequest: POST &#x27;/api/user/&#x27;&gt;</pre></td>
                  </tr>
                
              </tbody>
            </table>
            </details>
          
        </li>
      
        
        <li class="frame django">
          
            <code class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/envs/0.7.0/lib/python3.12/site-packages/django/core/handlers/base.py</code>, line 253, in _get_response_async
          

          
            <div class="context" id="c140501899109888">
              
                <ol start="246" class="pre-context" id="pre140501899109888">
                
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>            wrapped_callback = self.make_view_atomic(callback)</pre></li>
                
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>            # If it is a synchronous view, run it in a subthread</pre></li>
                
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>            if not iscoroutinefunction(wrapped_callback):</pre></li>
                
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>                wrapped_callback = sync_to_async(</pre></li>
                
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>                    wrapped_callback, thread_sensitive=True</pre></li>
                
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>                )</pre></li>
                
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>            try:</pre></li>
                
                </ol>
              
              <ol start="253" class="context-line">
                <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>                response = await wrapped_callback(
                                </pre> <span>…</span></li>
              </ol>
              
                <ol start='254' class="post-context" id="post140501899109888">
                  
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>                    request, *callback_args, **callback_kwargs</pre></li>
                  
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>                )</pre></li>
                  
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>            except Exception as e:</pre></li>
                  
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>                response = await sync_to_async(</pre></li>
                  
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>                    self.process_exception_by_middleware,</pre></li>
                  
                  <li onclick="toggle('pre140501899109888', 'post140501899109888')"><pre>                    thread_sensitive=True,</pre></li>
                  
              </ol>
              
            </div>
          

          
            
              <details>
                <summary class="commands">Local vars</summary>
            
            <table class="vars" id="v140501899109888">
              <thead>
                <tr>
                  <th scope="col">Variable</th>
                  <th scope="col">Value</th>
                </tr>
              </thead>
              <tbody>
                
                  <tr>
                    <td>callback</td>
                    <td class="code"><pre>&lt;function View.as_view.&lt;locals&gt;.view at 0x7fc926b6e7a0&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>callback_args</td>
                    <td class="code"><pre>()</pre></td>
                  </tr>
                
                  <tr>
                    <td>callback_kwargs</td>
                    <td class="code"><pre>{}</pre></td>
                  </tr>
                
                  <tr>
                    <td>middleware_method</td>
                    <td class="code"><pre>&lt;asgiref.sync.SyncToAsync object at 0x7fc925d6aae0&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>request</td>
                    <td class="code"><pre>&lt;ASGIRequest: POST &#x27;/api/user/&#x27;&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>response</td>
                    <td class="code"><pre>None</pre></td>
                  </tr>
                
                  <tr>
                    <td>self</td>
                    <td class="code"><pre>&lt;django.core.handlers.asgi.ASGIHandler object at 0x7fc925d68b90&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>wrapped_callback</td>
                    <td class="code"><pre>&lt;function View.as_view.&lt;locals&gt;.view at 0x7fc926b6e7a0&gt;</pre></td>
                  </tr>
                
              </tbody>
            </table>
            </details>
          
        </li>
      
        
        <li class="frame django">
          
            <code class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/envs/0.7.0/lib/python3.12/site-packages/django/views/decorators/csrf.py</code>, line 60, in _view_wrapper
          

          
            <div class="context" id="c140501899110016">
              
                <ol start="53" class="pre-context" id="pre140501899110016">
                
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre></pre></li>
                
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre>    # view_func.csrf_exempt = True would also work, but decorators are nicer</pre></li>
                
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre>    # if they don&#x27;t have side effects, so return a new function.</pre></li>
                
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre></pre></li>
                
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre>    if iscoroutinefunction(view_func):</pre></li>
                
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre></pre></li>
                
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre>        async def _view_wrapper(request, *args, **kwargs):</pre></li>
                
                </ol>
              
              <ol start="60" class="context-line">
                <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre>            return await view_func(request, *args, **kwargs)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</pre> <span>…</span></li>
              </ol>
              
                <ol start='61' class="post-context" id="post140501899110016">
                  
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre></pre></li>
                  
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre>    else:</pre></li>
                  
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre></pre></li>
                  
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre>        def _view_wrapper(request, *args, **kwargs):</pre></li>
                  
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre>            return view_func(request, *args, **kwargs)</pre></li>
                  
                  <li onclick="toggle('pre140501899110016', 'post140501899110016')"><pre></pre></li>
                  
              </ol>
              
            </div>
          

          
            
              <details>
                <summary class="commands">Local vars</summary>
            
            <table class="vars" id="v140501899110016">
              <thead>
                <tr>
                  <th scope="col">Variable</th>
                  <th scope="col">Value</th>
                </tr>
              </thead>
              <tbody>
                
                  <tr>
                    <td>args</td>
                    <td class="code"><pre>()</pre></td>
                  </tr>
                
                  <tr>
                    <td>kwargs</td>
                    <td class="code"><pre>{}</pre></td>
                  </tr>
                
                  <tr>
                    <td>request</td>
                    <td class="code"><pre>&lt;ASGIRequest: POST &#x27;/api/user/&#x27;&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>view_func</td>
                    <td class="code"><pre>&lt;function View.as_view.&lt;locals&gt;.view at 0x7fc926b6f560&gt;</pre></td>
                  </tr>
                
              </tbody>
            </table>
            </details>
          
        </li>
      
        
        <li class="frame user">
          
            <code class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py</code>, line 365, in decorator
          

          
            <div class="context" id="c140501899109824">
              
                <ol start="358" class="pre-context" id="pre140501899109824">
                
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>                    exc.raw_data,</pre></li>
                
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>                    status_code=exc.status_code,</pre></li>
                
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>                    headers=exc.headers,</pre></li>
                
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>                    cookies=getattr(exc, &#x27;cookies&#x27;, None),</pre></li>
                
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>                    renderer=getattr(exc, &#x27;renderer&#x27;, None),</pre></li>
                
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>                )</pre></li>
                
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>            except Exception as exc:</pre></li>
                
                </ol>
              
              <ol start="365" class="context-line">
                <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>                func_result = await self.handle_async_error(controller, exc)
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</pre> <span>…</span></li>
              </ol>
              
                <ol start='366' class="post-context" id="post140501899109824">
                  
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>            return self._make_http_response(controller, func_result)</pre></li>
                  
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre></pre></li>
                  
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>        return decorator</pre></li>
                  
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre></pre></li>
                  
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>    def _sync_endpoint(</pre></li>
                  
                  <li onclick="toggle('pre140501899109824', 'post140501899109824')"><pre>        self,</pre></li>
                  
              </ol>
              
            </div>
          

          
            
              <details>
                <summary class="commands">Local vars</summary>
            
            <table class="vars" id="v140501899109824">
              <thead>
                <tr>
                  <th scope="col">Variable</th>
                  <th scope="col">Value</th>
                </tr>
              </thead>
              <tbody>
                
                  <tr>
                    <td>args</td>
                    <td class="code"><pre>()</pre></td>
                  </tr>
                
                  <tr>
                    <td>context</td>
                    <td class="code"><pre>{&#x27;parsed_body&#x27;: UserCreateModel(email=&#x27;correct@old-domain.com&#x27;)}</pre></td>
                  </tr>
                
                  <tr>
                    <td>controller</td>
                    <td class="code"><pre>&lt;examples.routing.handler500.UserController object at 0x7fc925d55370&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>func</td>
                    <td class="code"><pre>&lt;function UserController.post at 0x7fc926b6d1c0&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>kwargs</td>
                    <td class="code"><pre>{}</pre></td>
                  </tr>
                
                  <tr>
                    <td>self</td>
                    <td class="code"><pre>&lt;dmr.endpoint.Endpoint object at 0x7fc925c306d0&gt;</pre></td>
                  </tr>
                
              </tbody>
            </table>
            </details>
          
        </li>
      
        
        <li class="frame user">
          
            <code class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py</code>, line 270, in handle_async_error
          

          
            <div class="context" id="c140501899109760">
              
                <ol start="263" class="pre-context" id="pre140501899109760">
                
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>            return await controller.handle_async_error(</pre></li>
                
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>                self,</pre></li>
                
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>                controller,</pre></li>
                
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>                exc,</pre></li>
                
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>            )</pre></li>
                
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>        except Exception:</pre></li>
                
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>            # And the last option is to handle error globally:</pre></li>
                
                </ol>
              
              <ol start="270" class="context-line">
                <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>            return self._global_error_handler(controller, exc)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</pre> <span>…</span></li>
              </ol>
              
                <ol start='271' class="post-context" id="post140501899109760">
                  
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre></pre></li>
                  
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>    def get_schema(</pre></li>
                  
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>        self,</pre></li>
                  
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>        path: str,</pre></li>
                  
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>        pattern: URLPattern,</pre></li>
                  
                  <li onclick="toggle('pre140501899109760', 'post140501899109760')"><pre>        controller_name: str,</pre></li>
                  
              </ol>
              
            </div>
          

          
            
              <details>
                <summary class="commands">Local vars</summary>
            
            <table class="vars" id="v140501899109760">
              <thead>
                <tr>
                  <th scope="col">Variable</th>
                  <th scope="col">Value</th>
                </tr>
              </thead>
              <tbody>
                
                  <tr>
                    <td>controller</td>
                    <td class="code"><pre>&lt;examples.routing.handler500.UserController object at 0x7fc925d55370&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>exc</td>
                    <td class="code"><pre>RuntimeError(&#x27;This error will be handled by handler500&#x27;)</pre></td>
                  </tr>
                
                  <tr>
                    <td>self</td>
                    <td class="code"><pre>&lt;dmr.endpoint.Endpoint object at 0x7fc925c306d0&gt;</pre></td>
                  </tr>
                
              </tbody>
            </table>
            </details>
          
        </li>
      
        
        <li class="frame user">
          
            <code class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py</code>, line 577, in _global_error_handler
          

          
            <div class="context" id="c140501899001728">
              
                <ol start="570" class="pre-context" id="pre140501899001728">
                
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>        exc: Exception,</pre></li>
                
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>    ) -&gt; HttpResponse:</pre></li>
                
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>        &quot;&quot;&quot;</pre></li>
                
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>        Import the global error handling and call it.</pre></li>
                
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre></pre></li>
                
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>        If not class level error handling has happened.</pre></li>
                
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>        &quot;&quot;&quot;</pre></li>
                
                </ol>
              
              <ol start="577" class="context-line">
                <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>        return resolve_setting(  # type: ignore[no-any-return]
                    ^^^^^^^^^^^^^^^^^</pre> <span>…</span></li>
              </ol>
              
                <ol start='578' class="post-context" id="post140501899001728">
                  
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>            Settings.global_error_handler,</pre></li>
                  
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>            import_string=True,</pre></li>
                  
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>        )(self, controller, exc)</pre></li>
                  
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre></pre></li>
                  
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre></pre></li>
                  
                  <li onclick="toggle('pre140501899001728', 'post140501899001728')"><pre>_ParamT = ParamSpec(&#x27;_ParamT&#x27;)</pre></li>
                  
              </ol>
              
            </div>
          

          
            
              <details>
                <summary class="commands">Local vars</summary>
            
            <table class="vars" id="v140501899001728">
              <thead>
                <tr>
                  <th scope="col">Variable</th>
                  <th scope="col">Value</th>
                </tr>
              </thead>
              <tbody>
                
                  <tr>
                    <td>controller</td>
                    <td class="code"><pre>&lt;examples.routing.handler500.UserController object at 0x7fc925d55370&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>exc</td>
                    <td class="code"><pre>RuntimeError(&#x27;This error will be handled by handler500&#x27;)</pre></td>
                  </tr>
                
                  <tr>
                    <td>self</td>
                    <td class="code"><pre>&lt;dmr.endpoint.Endpoint object at 0x7fc925c306d0&gt;</pre></td>
                  </tr>
                
              </tbody>
            </table>
            </details>
          
        </li>
      
        
        <li class="frame user">
          
            <code class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py</code>, line 263, in handle_async_error
          

          
            <div class="context" id="c140501898999616">
              
                <ol start="256" class="pre-context" id="pre140501898999616">
                
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>                )</pre></li>
                
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>            except Exception:  # noqa: S110</pre></li>
                
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>                # We don&#x27;t use `suppress` here for speed.</pre></li>
                
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>                pass  # noqa: WPS420</pre></li>
                
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>        # Per-endpoint error handler didn&#x27;t work.</pre></li>
                
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>        # Now, try the per-controller one.</pre></li>
                
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>        try:</pre></li>
                
                </ol>
              
              <ol start="263" class="context-line">
                <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>            return await controller.handle_async_error(
                        </pre> <span>…</span></li>
              </ol>
              
                <ol start='264' class="post-context" id="post140501898999616">
                  
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>                self,</pre></li>
                  
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>                controller,</pre></li>
                  
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>                exc,</pre></li>
                  
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>            )</pre></li>
                  
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>        except Exception:</pre></li>
                  
                  <li onclick="toggle('pre140501898999616', 'post140501898999616')"><pre>            # And the last option is to handle error globally:</pre></li>
                  
              </ol>
              
            </div>
          

          
            
              <details>
                <summary class="commands">Local vars</summary>
            
            <table class="vars" id="v140501898999616">
              <thead>
                <tr>
                  <th scope="col">Variable</th>
                  <th scope="col">Value</th>
                </tr>
              </thead>
              <tbody>
                
                  <tr>
                    <td>controller</td>
                    <td class="code"><pre>&lt;examples.routing.handler500.UserController object at 0x7fc925d55370&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>exc</td>
                    <td class="code"><pre>RuntimeError(&#x27;This error will be handled by handler500&#x27;)</pre></td>
                  </tr>
                
                  <tr>
                    <td>self</td>
                    <td class="code"><pre>&lt;dmr.endpoint.Endpoint object at 0x7fc925c306d0&gt;</pre></td>
                  </tr>
                
              </tbody>
            </table>
            </details>
          
        </li>
      
        
        <li class="frame user">
          
            <code class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py</code>, line 355, in decorator
          

          
            <div class="context" id="c140501922397504">
              
                <ol start="348" class="pre-context" id="pre140501922397504">
                
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                # Run checks:</pre></li>
                
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                await self._run_async_checks(controller)</pre></li>
                
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre></pre></li>
                
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                # Parse request:</pre></li>
                
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                context = self._serializer_context(self, controller)</pre></li>
                
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre></pre></li>
                
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                # Return response:</pre></li>
                
                </ol>
              
              <ol start="355" class="context-line">
                <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                func_result = await func(controller, **context)
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</pre> <span>…</span></li>
              </ol>
              
                <ol start='356' class="post-context" id="post140501922397504">
                  
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>            except (APIError, APIRedirectError) as exc:</pre></li>
                  
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                func_result = controller.to_error(</pre></li>
                  
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                    exc.raw_data,</pre></li>
                  
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                    status_code=exc.status_code,</pre></li>
                  
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                    headers=exc.headers,</pre></li>
                  
                  <li onclick="toggle('pre140501922397504', 'post140501922397504')"><pre>                    cookies=getattr(exc, &#x27;cookies&#x27;, None),</pre></li>
                  
              </ol>
              
            </div>
          

          
            
              <details>
                <summary class="commands">Local vars</summary>
            
            <table class="vars" id="v140501922397504">
              <thead>
                <tr>
                  <th scope="col">Variable</th>
                  <th scope="col">Value</th>
                </tr>
              </thead>
              <tbody>
                
                  <tr>
                    <td>args</td>
                    <td class="code"><pre>()</pre></td>
                  </tr>
                
                  <tr>
                    <td>context</td>
                    <td class="code"><pre>{&#x27;parsed_body&#x27;: UserCreateModel(email=&#x27;correct@old-domain.com&#x27;)}</pre></td>
                  </tr>
                
                  <tr>
                    <td>controller</td>
                    <td class="code"><pre>&lt;examples.routing.handler500.UserController object at 0x7fc925d55370&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>func</td>
                    <td class="code"><pre>&lt;function UserController.post at 0x7fc926b6d1c0&gt;</pre></td>
                  </tr>
                
                  <tr>
                    <td>kwargs</td>
                    <td class="code"><pre>{}</pre></td>
                  </tr>
                
                  <tr>
                    <td>self</td>
                    <td class="code"><pre>&lt;dmr.endpoint.Endpoint object at 0x7fc925c306d0&gt;</pre></td>
                  </tr>
                
              </tbody>
            </table>
            </details>
          
        </li>
      
        
        <li class="frame user">
          
            <code class="fname">/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/docs/examples/routing/handler500.py</code>, line 16, in post
          

          
            <div class="context" id="c140501914705280">
              
                <ol start="9" class="pre-context" id="pre140501914705280">
                
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>class UserCreateModel(pydantic.BaseModel):</pre></li>
                
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>    email: str</pre></li>
                
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre></pre></li>
                
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre></pre></li>
                
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>class UserController(Controller[PydanticSerializer]):</pre></li>
                
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>    async def post(self, parsed_body: Body[UserCreateModel]) -&gt; UserCreateModel:</pre></li>
                
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>        if parsed_body.email.endswith(&#x27;@old-domain.com&#x27;):</pre></li>
                
                </ol>
              
              <ol start="16" class="context-line">
                <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>            raise RuntimeError(&#x27;This error will be handled by handler500&#x27;)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</pre> <span>…</span></li>
              </ol>
              
                <ol start='17' class="post-context" id="post140501914705280">
                  
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>        return parsed_body</pre></li>
                  
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre></pre></li>
                  
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre></pre></li>
                  
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>router = Router(</pre></li>
                  
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>    &#x27;api/&#x27;,</pre></li>
                  
                  <li onclick="toggle('pre140501914705280', 'post140501914705280')"><pre>    [</pre></li>
                  
              </ol>
              
            </div>
          

          
            
              <details>
                <summary class="commands">Local vars</summary>
            
            <table class="vars" id="v140501914705280">
              <thead>
                <tr>
                  <th scope="col">Variable</th>
                  <th scope="col">Value</th>
                </tr>
              </thead>
              <tbody>
                
                  <tr>
                    <td>parsed_body</td>
                    <td class="code"><pre>UserCreateModel(email=&#x27;correct@old-domain.com&#x27;)</pre></td>
                  </tr>
                
                  <tr>
                    <td>self</td>
                    <td class="code"><pre>&lt;examples.routing.handler500.UserController object at 0x7fc925d55370&gt;</pre></td>
                  </tr>
                
              </tbody>
            </table>
            </details>
          
        </li>
      
    </ul>
  </div>

  <form action="https://dpaste.com/" name="pasteform" id="pasteform" method="post">
  <div id="pastebinTraceback" class="pastebin">
    <input type="hidden" name="language" value="PythonConsole">
    <input type="hidden" name="title"
      value="RuntimeError at /api/user/">
    <input type="hidden" name="source" value="Django Dpaste Agent">
    <input type="hidden" name="poster" value="Django">
    <textarea name="content" id="traceback_area" cols="140" rows="25">
Environment:


Request Method: POST
Request URL: http://127.0.0.1:36887/api/user/

Django Version: 5.2.13
Python Version: 3.12.10
Installed Applications:
[&#x27;django.contrib.auth&#x27;,
 &#x27;django.contrib.sessions&#x27;,
 &#x27;django.contrib.contenttypes&#x27;,
 &#x27;dmr&#x27;,
 &#x27;dmr.security.jwt.blocklist&#x27;,
 &#x27;server.apps.model_simple&#x27;,
 &#x27;server.apps.model_fk&#x27;]
Installed Middleware:
[&#x27;django.middleware.security.SecurityMiddleware&#x27;,
 &#x27;django.contrib.sessions.middleware.SessionMiddleware&#x27;,
 &#x27;django.middleware.common.CommonMiddleware&#x27;,
 &#x27;django.middleware.csrf.CsrfViewMiddleware&#x27;,
 &#x27;django.contrib.auth.middleware.AuthenticationMiddleware&#x27;,
 &#x27;django.middleware.locale.LocaleMiddleware&#x27;,
 &#x27;django.contrib.messages.middleware.MessageMiddleware&#x27;,
 &#x27;django.middleware.clickjacking.XFrameOptionsMiddleware&#x27;]



Traceback (most recent call last):
  File "/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/envs/0.7.0/lib/python3.12/site-packages/django/core/handlers/exception.py", line 42, in inner
    response = await get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/envs/0.7.0/lib/python3.12/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
    response = await wrapped_callback(
               
  File "/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/envs/0.7.0/lib/python3.12/site-packages/django/views/decorators/csrf.py", line 60, in _view_wrapper
    return await view_func(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py", line 365, in decorator
    func_result = await self.handle_async_error(controller, exc)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py", line 270, in handle_async_error
    return self._global_error_handler(controller, exc)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py", line 577, in _global_error_handler
    return resolve_setting(  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^
  File "/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py", line 263, in handle_async_error
    return await controller.handle_async_error(
           
  File "/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/endpoint.py", line 355, in decorator
    func_result = await func(controller, **context)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/docs/examples/routing/handler500.py", line 16, in post
    raise RuntimeError(&#x27;This error will be handled by handler500&#x27;)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Exception Type: RuntimeError at /api/user/
Exception Value: This error will be handled by handler500
</textarea>
  <br><br>
  <input type="submit" value="Share this traceback on a public website">
  </div>
</form>

</div>


<div id="requestinfo">
  <h2>Request information</h2>


  
    <h3 id="user-info">USER</h3>
    <p>AnonymousUser</p>
  

  <h3 id="get-info">GET</h3>
  
    <p>No GET data</p>
  

  <h3 id="post-info">POST</h3>
  
    <p>No POST data</p>
  

  <h3 id="files-info">FILES</h3>
  
    <p>No FILES data</p>
  

  <h3 id="cookie-info">COOKIES</h3>
  
    <p>No cookie data</p>
  

  <h3 id="meta-info">META</h3>
  <table class="req">
    <thead>
      <tr>
        <th scope="col">Variable</th>
        <th scope="col">Value</th>
      </tr>
    </thead>
    <tbody>
      
        <tr>
          <td>CONTENT_LENGTH</td>
          <td class="code"><pre>&#x27;35&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>CONTENT_TYPE</td>
          <td class="code"><pre>&#x27;application/json&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>HTTP_ACCEPT</td>
          <td class="code"><pre>&#x27;*/*&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>HTTP_HOST</td>
          <td class="code"><pre>&#x27;127.0.0.1:36887&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>HTTP_USER_AGENT</td>
          <td class="code"><pre>&#x27;curl/7.81.0&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>PATH_INFO</td>
          <td class="code"><pre>&#x27;/api/user/&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>QUERY_STRING</td>
          <td class="code"><pre>&#x27;&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>REMOTE_ADDR</td>
          <td class="code"><pre>&#x27;127.0.0.1&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>REMOTE_HOST</td>
          <td class="code"><pre>&#x27;127.0.0.1&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>REMOTE_PORT</td>
          <td class="code"><pre>46988</pre></td>
        </tr>
      
        <tr>
          <td>REQUEST_METHOD</td>
          <td class="code"><pre>&#x27;POST&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SCRIPT_NAME</td>
          <td class="code"><pre>&#x27;&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SERVER_NAME</td>
          <td class="code"><pre>&#x27;127.0.0.1&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SERVER_PORT</td>
          <td class="code"><pre>&#x27;36887&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>wsgi.multiprocess</td>
          <td class="code"><pre>True</pre></td>
        </tr>
      
        <tr>
          <td>wsgi.multithread</td>
          <td class="code"><pre>True</pre></td>
        </tr>
      
    </tbody>
  </table>


  <h3 id="settings-info">Settings</h3>
  <h4>Using settings module <code></code></h4>
  <table class="req">
    <thead>
      <tr>
        <th scope="col">Setting</th>
        <th scope="col">Value</th>
      </tr>
    </thead>
    <tbody>
      
        <tr>
          <td>ABSOLUTE_URL_OVERRIDES</td>
          <td class="code"><pre>{}</pre></td>
        </tr>
      
        <tr>
          <td>ADMINS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>ALLOWED_HOSTS</td>
          <td class="code"><pre>[&#x27;*&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>APPEND_SLASH</td>
          <td class="code"><pre>True</pre></td>
        </tr>
      
        <tr>
          <td>AUTHENTICATION_BACKENDS</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>AUTH_PASSWORD_VALIDATORS</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>AUTH_USER_MODEL</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>CACHES</td>
          <td class="code"><pre>{&#x27;default&#x27;: {&#x27;BACKEND&#x27;: &#x27;django.core.cache.backends.filebased.FileBasedCache&#x27;,
             &#x27;LOCATION&#x27;: &#x27;/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/docs/_build/default.cache&#x27;},
 &#x27;throttling&#x27;: {&#x27;BACKEND&#x27;: &#x27;django.core.cache.backends.filebased.FileBasedCache&#x27;,
                &#x27;LOCATION&#x27;: &#x27;/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/docs/_build/throttling.cache&#x27;}}</pre></td>
        </tr>
      
        <tr>
          <td>CACHE_MIDDLEWARE_ALIAS</td>
          <td class="code"><pre>&#x27;default&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>CACHE_MIDDLEWARE_KEY_PREFIX</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>CACHE_MIDDLEWARE_SECONDS</td>
          <td class="code"><pre>600</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_COOKIE_AGE</td>
          <td class="code"><pre>31449600</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_COOKIE_DOMAIN</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_COOKIE_HTTPONLY</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_COOKIE_NAME</td>
          <td class="code"><pre>&#x27;csrftoken&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_COOKIE_PATH</td>
          <td class="code"><pre>&#x27;/&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_COOKIE_SAMESITE</td>
          <td class="code"><pre>&#x27;Lax&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_COOKIE_SECURE</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_FAILURE_VIEW</td>
          <td class="code"><pre>&#x27;django.views.csrf.csrf_failure&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_HEADER_NAME</td>
          <td class="code"><pre>&#x27;HTTP_X_CSRFTOKEN&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_TRUSTED_ORIGINS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>CSRF_USE_SESSIONS</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>DATABASES</td>
          <td class="code"><pre>{&#x27;default&#x27;: {&#x27;ATOMIC_REQUESTS&#x27;: False,
             &#x27;AUTOCOMMIT&#x27;: True,
             &#x27;CONN_HEALTH_CHECKS&#x27;: False,
             &#x27;CONN_MAX_AGE&#x27;: 0,
             &#x27;ENGINE&#x27;: &#x27;django.db.backends.sqlite3&#x27;,
             &#x27;HOST&#x27;: &#x27;&#x27;,
             &#x27;NAME&#x27;: &#x27;_build/test.db&#x27;,
             &#x27;OPTIONS&#x27;: {},
             &#x27;PASSWORD&#x27;: &#x27;********************&#x27;,
             &#x27;PORT&#x27;: &#x27;&#x27;,
             &#x27;TEST&#x27;: {&#x27;CHARSET&#x27;: None,
                      &#x27;COLLATION&#x27;: None,
                      &#x27;MIGRATE&#x27;: True,
                      &#x27;MIRROR&#x27;: None,
                      &#x27;NAME&#x27;: None},
             &#x27;TIME_ZONE&#x27;: None,
             &#x27;USER&#x27;: &#x27;&#x27;}}</pre></td>
        </tr>
      
        <tr>
          <td>DATABASE_ROUTERS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>DATA_UPLOAD_MAX_MEMORY_SIZE</td>
          <td class="code"><pre>2621440</pre></td>
        </tr>
      
        <tr>
          <td>DATA_UPLOAD_MAX_NUMBER_FIELDS</td>
          <td class="code"><pre>1000</pre></td>
        </tr>
      
        <tr>
          <td>DATA_UPLOAD_MAX_NUMBER_FILES</td>
          <td class="code"><pre>100</pre></td>
        </tr>
      
        <tr>
          <td>DATETIME_FORMAT</td>
          <td class="code"><pre>&#x27;N j, Y, P&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DATETIME_INPUT_FORMATS</td>
          <td class="code"><pre>[&#x27;%Y-%m-%d %H:%M:%S&#x27;,
 &#x27;%Y-%m-%d %H:%M:%S.%f&#x27;,
 &#x27;%Y-%m-%d %H:%M&#x27;,
 &#x27;%m/%d/%Y %H:%M:%S&#x27;,
 &#x27;%m/%d/%Y %H:%M:%S.%f&#x27;,
 &#x27;%m/%d/%Y %H:%M&#x27;,
 &#x27;%m/%d/%y %H:%M:%S&#x27;,
 &#x27;%m/%d/%y %H:%M:%S.%f&#x27;,
 &#x27;%m/%d/%y %H:%M&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>DATE_FORMAT</td>
          <td class="code"><pre>&#x27;N j, Y&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DATE_INPUT_FORMATS</td>
          <td class="code"><pre>[&#x27;%Y-%m-%d&#x27;,
 &#x27;%m/%d/%Y&#x27;,
 &#x27;%m/%d/%y&#x27;,
 &#x27;%b %d %Y&#x27;,
 &#x27;%b %d, %Y&#x27;,
 &#x27;%d %b %Y&#x27;,
 &#x27;%d %b, %Y&#x27;,
 &#x27;%B %d %Y&#x27;,
 &#x27;%B %d, %Y&#x27;,
 &#x27;%d %B %Y&#x27;,
 &#x27;%d %B, %Y&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>DEBUG</td>
          <td class="code"><pre>True</pre></td>
        </tr>
      
        <tr>
          <td>DEBUG_PROPAGATE_EXCEPTIONS</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>DECIMAL_SEPARATOR</td>
          <td class="code"><pre>&#x27;.&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DEFAULT_AUTO_FIELD</td>
          <td class="code"><pre>&#x27;django.db.models.BigAutoField&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DEFAULT_CHARSET</td>
          <td class="code"><pre>&#x27;utf-8&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DEFAULT_EXCEPTION_REPORTER</td>
          <td class="code"><pre>&#x27;django.views.debug.ExceptionReporter&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DEFAULT_EXCEPTION_REPORTER_FILTER</td>
          <td class="code"><pre>&#x27;django.views.debug.SafeExceptionReporterFilter&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DEFAULT_FROM_EMAIL</td>
          <td class="code"><pre>&#x27;webmaster@localhost&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DEFAULT_INDEX_TABLESPACE</td>
          <td class="code"><pre>&#x27;&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DEFAULT_TABLESPACE</td>
          <td class="code"><pre>&#x27;&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>DISALLOWED_USER_AGENTS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_BACKEND</td>
          <td class="code"><pre>&#x27;django.core.mail.backends.smtp.EmailBackend&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_HOST</td>
          <td class="code"><pre>&#x27;localhost&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_HOST_PASSWORD</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_HOST_USER</td>
          <td class="code"><pre>&#x27;&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_PORT</td>
          <td class="code"><pre>25</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_SSL_CERTFILE</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_SSL_KEYFILE</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_SUBJECT_PREFIX</td>
          <td class="code"><pre>&#x27;[Django] &#x27;</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_TIMEOUT</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_USE_LOCALTIME</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_USE_SSL</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>EMAIL_USE_TLS</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>FILE_UPLOAD_DIRECTORY_PERMISSIONS</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>FILE_UPLOAD_HANDLERS</td>
          <td class="code"><pre>[&#x27;django.core.files.uploadhandler.MemoryFileUploadHandler&#x27;,
 &#x27;django.core.files.uploadhandler.TemporaryFileUploadHandler&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>FILE_UPLOAD_MAX_MEMORY_SIZE</td>
          <td class="code"><pre>2621440</pre></td>
        </tr>
      
        <tr>
          <td>FILE_UPLOAD_PERMISSIONS</td>
          <td class="code"><pre>420</pre></td>
        </tr>
      
        <tr>
          <td>FILE_UPLOAD_TEMP_DIR</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>FIRST_DAY_OF_WEEK</td>
          <td class="code"><pre>0</pre></td>
        </tr>
      
        <tr>
          <td>FIXTURE_DIRS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>FORCE_SCRIPT_NAME</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>FORMAT_MODULE_PATH</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>FORMS_URLFIELD_ASSUME_HTTPS</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>FORM_RENDERER</td>
          <td class="code"><pre>&#x27;django.forms.renderers.DjangoTemplates&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>HTTP_BASIC_PASSWORD</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>HTTP_BASIC_USERNAME</td>
          <td class="code"><pre>&#x27;admin&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>IGNORABLE_404_URLS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>INSTALLED_APPS</td>
          <td class="code"><pre>[&#x27;django.contrib.auth&#x27;,
 &#x27;django.contrib.sessions&#x27;,
 &#x27;django.contrib.contenttypes&#x27;,
 &#x27;dmr&#x27;,
 &#x27;dmr.security.jwt.blocklist&#x27;,
 &#x27;server.apps.model_simple&#x27;,
 &#x27;server.apps.model_fk&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>INTERNAL_IPS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGES</td>
          <td class="code"><pre>((&#x27;en&#x27;, &#x27;English&#x27;), (&#x27;ru&#x27;, &#x27;Russian&#x27;))</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGES_BIDI</td>
          <td class="code"><pre>[&#x27;he&#x27;, &#x27;ar&#x27;, &#x27;ar-dz&#x27;, &#x27;ckb&#x27;, &#x27;fa&#x27;, &#x27;ug&#x27;, &#x27;ur&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGE_CODE</td>
          <td class="code"><pre>&#x27;en-us&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGE_COOKIE_AGE</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGE_COOKIE_DOMAIN</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGE_COOKIE_HTTPONLY</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGE_COOKIE_NAME</td>
          <td class="code"><pre>&#x27;django_language&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGE_COOKIE_PATH</td>
          <td class="code"><pre>&#x27;/&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGE_COOKIE_SAMESITE</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>LANGUAGE_COOKIE_SECURE</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>LOCALE_PATHS</td>
          <td class="code"><pre>[&#x27;/home/docs/checkouts/readthedocs.org/user_builds/django-modern-rest/checkouts/0.7.0/dmr/locale&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>LOGGING</td>
          <td class="code"><pre>{}</pre></td>
        </tr>
      
        <tr>
          <td>LOGGING_CONFIG</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>LOGIN_REDIRECT_URL</td>
          <td class="code"><pre>&#x27;/accounts/profile/&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>LOGIN_URL</td>
          <td class="code"><pre>&#x27;/accounts/login/&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>LOGOUT_REDIRECT_URL</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>MANAGERS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>MEDIA_ROOT</td>
          <td class="code"><pre>&#x27;&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>MEDIA_URL</td>
          <td class="code"><pre>&#x27;/&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>MESSAGE_STORAGE</td>
          <td class="code"><pre>&#x27;django.contrib.messages.storage.fallback.FallbackStorage&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>MIDDLEWARE</td>
          <td class="code"><pre>[&#x27;django.middleware.security.SecurityMiddleware&#x27;,
 &#x27;django.contrib.sessions.middleware.SessionMiddleware&#x27;,
 &#x27;django.middleware.common.CommonMiddleware&#x27;,
 &#x27;django.middleware.csrf.CsrfViewMiddleware&#x27;,
 &#x27;django.contrib.auth.middleware.AuthenticationMiddleware&#x27;,
 &#x27;django.middleware.locale.LocaleMiddleware&#x27;,
 &#x27;django.contrib.messages.middleware.MessageMiddleware&#x27;,
 &#x27;django.middleware.clickjacking.XFrameOptionsMiddleware&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>MIGRATION_MODULES</td>
          <td class="code"><pre>{}</pre></td>
        </tr>
      
        <tr>
          <td>MONTH_DAY_FORMAT</td>
          <td class="code"><pre>&#x27;F j&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>NUMBER_GROUPING</td>
          <td class="code"><pre>0</pre></td>
        </tr>
      
        <tr>
          <td>PASSWORD_HASHERS</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>PASSWORD_RESET_TIMEOUT</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>PREPEND_WWW</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>ROOT_URLCONF</td>
          <td class="code"><pre>&#x27;url_conf&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SECRET_KEY</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SECRET_KEY_FALLBACKS</td>
          <td class="code"><pre>&#x27;********************&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_CONTENT_TYPE_NOSNIFF</td>
          <td class="code"><pre>True</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_CROSS_ORIGIN_OPENER_POLICY</td>
          <td class="code"><pre>&#x27;same-origin&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_HSTS_INCLUDE_SUBDOMAINS</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_HSTS_PRELOAD</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_HSTS_SECONDS</td>
          <td class="code"><pre>0</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_PROXY_SSL_HEADER</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_REDIRECT_EXEMPT</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_REFERRER_POLICY</td>
          <td class="code"><pre>&#x27;same-origin&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_SSL_HOST</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>SECURE_SSL_REDIRECT</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>SERVER_EMAIL</td>
          <td class="code"><pre>&#x27;root@localhost&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_CACHE_ALIAS</td>
          <td class="code"><pre>&#x27;default&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_COOKIE_AGE</td>
          <td class="code"><pre>1209600</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_COOKIE_DOMAIN</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_COOKIE_HTTPONLY</td>
          <td class="code"><pre>True</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_COOKIE_NAME</td>
          <td class="code"><pre>&#x27;sessionid&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_COOKIE_PATH</td>
          <td class="code"><pre>&#x27;/&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_COOKIE_SAMESITE</td>
          <td class="code"><pre>&#x27;Lax&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_COOKIE_SECURE</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_ENGINE</td>
          <td class="code"><pre>&#x27;django.contrib.sessions.backends.db&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_EXPIRE_AT_BROWSER_CLOSE</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_FILE_PATH</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_SAVE_EVERY_REQUEST</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>SESSION_SERIALIZER</td>
          <td class="code"><pre>&#x27;django.contrib.sessions.serializers.JSONSerializer&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SHORT_DATETIME_FORMAT</td>
          <td class="code"><pre>&#x27;m/d/Y P&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SHORT_DATE_FORMAT</td>
          <td class="code"><pre>&#x27;m/d/Y&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SIGNING_BACKEND</td>
          <td class="code"><pre>&#x27;django.core.signing.TimestampSigner&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>SILENCED_SYSTEM_CHECKS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>STATICFILES_DIRS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>STATICFILES_FINDERS</td>
          <td class="code"><pre>[&#x27;django.contrib.staticfiles.finders.FileSystemFinder&#x27;,
 &#x27;django.contrib.staticfiles.finders.AppDirectoriesFinder&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>STATIC_ROOT</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>STATIC_URL</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>STORAGES</td>
          <td class="code"><pre>{&#x27;default&#x27;: {&#x27;BACKEND&#x27;: &#x27;django.core.files.storage.FileSystemStorage&#x27;},
 &#x27;staticfiles&#x27;: {&#x27;BACKEND&#x27;: &#x27;django.contrib.staticfiles.storage.StaticFilesStorage&#x27;}}</pre></td>
        </tr>
      
        <tr>
          <td>TEMPLATES</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>TEST_NON_SERIALIZED_APPS</td>
          <td class="code"><pre>[]</pre></td>
        </tr>
      
        <tr>
          <td>TEST_RUNNER</td>
          <td class="code"><pre>&#x27;django.test.runner.DiscoverRunner&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>THOUSAND_SEPARATOR</td>
          <td class="code"><pre>&#x27;,&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>TIME_FORMAT</td>
          <td class="code"><pre>&#x27;P&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>TIME_INPUT_FORMATS</td>
          <td class="code"><pre>[&#x27;%H:%M:%S&#x27;, &#x27;%H:%M:%S.%f&#x27;, &#x27;%H:%M&#x27;]</pre></td>
        </tr>
      
        <tr>
          <td>TIME_ZONE</td>
          <td class="code"><pre>&#x27;America/Chicago&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>USE_I18N</td>
          <td class="code"><pre>True</pre></td>
        </tr>
      
        <tr>
          <td>USE_THOUSAND_SEPARATOR</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>USE_TZ</td>
          <td class="code"><pre>True</pre></td>
        </tr>
      
        <tr>
          <td>USE_X_FORWARDED_HOST</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>USE_X_FORWARDED_PORT</td>
          <td class="code"><pre>False</pre></td>
        </tr>
      
        <tr>
          <td>WSGI_APPLICATION</td>
          <td class="code"><pre>None</pre></td>
        </tr>
      
        <tr>
          <td>X_FRAME_OPTIONS</td>
          <td class="code"><pre>&#x27;DENY&#x27;</pre></td>
        </tr>
      
        <tr>
          <td>YEAR_MONTH_FORMAT</td>
          <td class="code"><pre>&#x27;F Y&#x27;</pre></td>
        </tr>
      
    </tbody>
  </table>

</div>
</main>


  <footer id="explanation">
    <p>
      You’re seeing this error because you have <code>DEBUG = True</code> in your
      Django settings file. Change that to <code>False</code>, and Django will
      display a standard page generated by the handler for this status code.
    </p>
  </footer>

</body>
</html>

See also

Error handling if you want to learn how to handle different errors on different levels and fix these 500 exceptions.

Optimized URL Routing

django-modern-rest provides an optimized dmr.routing.path() function that is a drop-in replacement for Django’s django.urls.path().

The custom implementation uses prefix-based pattern matching for faster routing. Instead of immediately running Django’s regex engine on every request, it performs a quick prefix check first.

Performance Impact

Benchmark results on MacBook Pro M4 Pro:

  • Best case: 9% faster (match found in first few URL patterns)

  • Average case: 13% faster (match found in middle of URL patterns list)

  • Worst case: 31% faster (404 Not Found, all patterns checked)

The prefix-based optimization dramatically reduces regex operations:

  • Static routes: Simple string comparison (no regex at all)

  • Dynamic routes: Regex only runs when prefix matches

  • Failed matches: Eliminated in one operation (startswith check)

This is especially beneficial for applications with:

  • Large number of routes

  • High traffic

Migration

Simply replace Django’s path with dmr.routing.path():

# Instead of ``from django.urls import path``:
from dmr.routing import path
from django.urls import include

urlpatterns = [
    path('api/', include('myapp.urls')),
]

This is a drop-in replacement with no API changes required.