HTTP 503 in get-next-for-worker generates a mail to administrators

When a worker triggers an HTTP 503 on /api/1.0/work-request/get-next-for-worker/, it generates a mail to the administrators (ADMINS setting).

A sample mail body is below. There's no traceback, it's likely because it's not caused by an exception but some other Django-specific mechanism to deal with this error code?

Subject: [Django] ERROR (EXTERNAL IP): Service Unavailable: /api/1.0/work-request/get-next-for-worker/

Service Unavailable: /api/1.0/work-request/get-next-for-worker/

Report at /api/1.0/work-request/get-next-for-worker/
Service Unavailable: /api/1.0/work-request/get-next-for-worker/

Request Method: GET
Request URL: https://debusine.freexian.com/api/1.0/work-request/get-next-for-worker/
Django Version: 4.2.28
Python Executable: /usr/bin/python3
Python Version: 3.13.5
Python Path: ['/var/lib/debusine/server', '/var/lib/debusine/server', '/usr/bin', '/usr/lib/python313.zip', '/usr/lib/python3.13', '/usr/lib/python3.13/lib-dynload', '/usr/local/lib/python3.13/dist-packages', '/usr/lib/python3/dist-packages']
Server time: Tue, 03 Mar 2026 11:33:32 +0000
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django_celery_results',
 'django_prometheus',
 'channels',
 'pgtrigger',
 'rest_framework',
 'debusine.db',
 'debusine.server',
 'debusine.web']
Installed Middleware:
['django_prometheus.middleware.PrometheusBeforeMiddleware',
 'debusine.server.middlewares.virtual_hosts.VirtualHostMiddleware',
 'debusine.server.middlewares.context.ContextMiddleware',
 'debusine.server.middlewares.headers.HeadersMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'debusine.server.middlewares.scopes.ScopeMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'debusine.server.signon.middleware.SignonMiddleware',
 'debusine.server.middlewares.scopes.AuthorizationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django_prometheus.middleware.PrometheusAfterMiddleware']


Traceback (most recent call last):
  None


Raised during: debusine.server.views.workers.GetNextWorkRequestView
Request information:
USER: AnonymousUser

GET: No GET data

POST: No POST data

FILES: No FILES data

COOKIES: No cookie data

META:
HTTP_ACCEPT = '*/*'
HTTP_ACCEPT_ENCODING = 'gzip, deflate'
HTTP_CONNECTION = 'close'
HTTP_HOST = 'debusine.freexian.com'
HTTP_TOKEN = '********************'
HTTP_USER_AGENT = 'Python/3.13 aiohttp/3.11.16'
HTTP_X_FORWARDED_FOR = '2a01:4f8:2190:1c1f::1:7'
HTTP_X_FORWARDED_PROTO = 'https'
HTTP_X_FREEXIAN_USERNAME = ''
PATH_INFO = '/api/1.0/work-request/get-next-for-worker/'
QUERY_STRING = ''
REQUEST_METHOD = 'GET'
SCRIPT_NAME = ''
SERVER_NAME = 'unknown'
SERVER_PORT = '0'
wsgi.multiprocess = True
wsgi.multithread = True

Settings:
Using settings module debusine.project.settings
ABSOLUTE_URL_OVERRIDES = {}
[... skipping the rest ...]
Edited by Raphaël Hertzog