django-maintenance-mode shows a 503 error page when maintenance-mode is on.
It works at application level, so your django instance should be up.
It doesn't use database and doesn't prevent database access.
pip install django-maintenance-mode
or download django-maintenance-mode and add the maintenance_mode package to your projectmaintenance_mode
to settings.INSTALLED_APPS
before custom applicationsmaintenance_mode.middleware.MaintenanceModeMiddleware
to settings.MIDDLEWARE
as last middlewaretemplates/503.html
fileAll these settings are optional, if not defined in settings.py
the default values (listed below) will be used.
# if True the maintenance-mode will be activated MAINTENANCE_MODE = None
# by default, to get/set the state value a local file backend is used # if you want to use the db or cache, you can create a custom backend # custom backends must extend 'maintenance_mode.backends.AbstractStateBackend' class # and implement get_value(self) and set_value(self, val) methods MAINTENANCE_MODE_STATE_BACKEND = "maintenance_mode.backends.LocalFileBackend" # alternatively it is possible to use the default storage backend MAINTENANCE_MODE_STATE_BACKEND = "maintenance_mode.backends.DefaultStorageBackend" # alternatively it is possible to use the static storage backend # make sure that STATIC_ROOT and STATIC_URL are also set MAINTENANCE_MODE_STATE_BACKEND = "maintenance_mode.backends.StaticStorageBackend" # alternatively it is possible to use the cache backend # you can use a custom cache backend by adding a `maintenance_mode` entry to `settings.CACHES`, # otherwise the default cache backend will be used. MAINTENANCE_MODE_STATE_BACKEND = "maintenance_mode.backends.CacheBackend"
# the fallback value that backends will return in case of failure # (actually this is only used by "maintenance_mode.backends.CacheBackend") MAINTENANCE_MODE_STATE_BACKEND_FALLBACK_VALUE = False
# by default, a file named "maintenance_mode_state.txt" will be created in the settings.py directory # you can customize the state file path in case the default one is not writable MAINTENANCE_MODE_STATE_FILE_PATH = "maintenance_mode_state.txt"
# if True admin site will not be affected by the maintenance-mode page MAINTENANCE_MODE_IGNORE_ADMIN_SITE = False
# if True anonymous users will not see the maintenance-mode page MAINTENANCE_MODE_IGNORE_ANONYMOUS_USER = False
# if True authenticated users will not see the maintenance-mode page MAINTENANCE_MODE_IGNORE_AUTHENTICATED_USER = False
# if True the staff will not see the maintenance-mode page MAINTENANCE_MODE_IGNORE_STAFF = False
# if True the superuser will not see the maintenance-mode page MAINTENANCE_MODE_IGNORE_SUPERUSER = False
# list of ip-addresses that will not be affected by the maintenance-mode # ip-addresses will be used to compile regular expressions objects MAINTENANCE_MODE_IGNORE_IP_ADDRESSES = ()
# the path of the function that will return the client IP address given the request object -> 'myapp.mymodule.myfunction' # the default function ('maintenance_mode.utils.get_client_ip_address') returns request.META['REMOTE_ADDR'] # in some cases the default function returns None, to avoid this scenario just use 'django-ipware' MAINTENANCE_MODE_GET_CLIENT_IP_ADDRESS = None
Retrieve user's real IP address using django-ipware
:
MAINTENANCE_MODE_GET_CLIENT_IP_ADDRESS = "ipware.ip.get_ip"
# the path of the function that will return the response context -> 'myapp.mymodule.myfunction' MAINTENANCE_MODE_GET_CONTEXT = None
# list of urls that will not be affected by the maintenance-mode # urls will be used to compile regular expressions objects MAINTENANCE_MODE_IGNORE_URLS = ()
# if True the maintenance mode will not return 503 response while running tests # useful for running tests while maintenance mode is on, before opening the site to public use MAINTENANCE_MODE_IGNORE_TESTS = False
# if True authenticated users will be logged out from their current session MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER = False
# the absolute url where users will be redirected to during maintenance-mode MAINTENANCE_MODE_REDIRECT_URL = None
# the type of the response returned during maintenance mode, can be either "html" or "json" MAINTENANCE_MODE_RESPONSE_TYPE = "html"
# the template that will be shown by the maintenance-mode page MAINTENANCE_MODE_TEMPLATE = "503.html"
# the HTTP status code to send MAINTENANCE_MODE_STATUS_CODE = 503
# the value in seconds of the Retry-After header during maintenance-mode MAINTENANCE_MODE_RETRY_AFTER = 3600 # 1 hour
Add maintenance_mode.context_processors.maintenance_mode to your context_processors list in settings.py
if you want to access the maintenance_mode status in your templates.
TEMPLATES = [ { # ... "OPTIONS": { "context_processors": [ # ... "maintenance_mode.context_processors.maintenance_mode", # ... ], }, # ... }, ]
You can disable emailing 503 errors to admins while maintenance mode is enabled:
LOGGING = { "filters": { "require_not_maintenance_mode_503": { "()": "maintenance_mode.logging.RequireNotMaintenanceMode503", }, ... }, "handlers": { ... }, ... }
You can force a block of code execution to run under maintenance mode or not using context managers:
from maintenance_mode.core import maintenance_mode_off, maintenance_mode_on with maintenance_mode_on(): # do stuff pass with maintenance_mode_off(): # do stuff pass
Add maintenance_mode.urls to urls.py
if you want superusers able to set maintenance_mode using urls.
urlpatterns = [ # ... re_path(r"^maintenance-mode/", include("maintenance_mode.urls")), # ... ]
You can force maintenance mode on/off at view level using view decorators:
from maintenance_mode.decorators import force_maintenance_mode_off, force_maintenance_mode_on @force_maintenance_mode_off def my_view_a(request): # never return 503 response pass @force_maintenance_mode_on def my_view_b(request): # always return 503 response pass
from maintenance_mode.decorators import force_maintenance_mode_off, force_maintenance_mode_on urlpatterns = [ # never return 503 response path("", force_maintenance_mode_off(YourView.as_view()), name="my_view"), # always return 503 response path("", force_maintenance_mode_on(YourView.as_view()), name="my_view"), ]
from maintenance_mode.core import get_maintenance_mode, set_maintenance_mode set_maintenance_mode(True) if get_maintenance_mode(): set_maintenance_mode(False)
or
from django.core.management import call_command from django.core.management.base import BaseCommand class Command(BaseCommand): def handle(self, *args, **options): call_command("maintenance_mode", "on") # call your command(s) call_command("maintenance_mode", "off")
{% if maintenance_mode %} <!-- html --> {% endif %}
Run python manage.py maintenance_mode <on|off>
(This is not Heroku-friendly because any execution of heroku run manage.py
will be run on a separate worker dyno, not the web one. Therefore the state-file is set but on the wrong machine. You should use a custom MAINTENANCE_MODE_STATE_BACKEND
.)
Superusers can change maintenance-mode using the following urls:
/maintenance-mode/off/
/maintenance-mode/on/
# clone repository git clone https://github.com/fabiocaccamo/django-maintenance-mode.git && cd django-maintenance-mode # create virtualenv and activate it python -m venv venv && . venv/bin/activate # upgrade pip python -m pip install --upgrade pip # install requirements pip install -r requirements.txt -r requirements-test.txt # install pre-commit to run formatters and linters pre-commit install --install-hooks # run tests tox # or python runtests.py # or python -m django test --settings "tests.settings"
Released under MIT License.
django-admin-interface
- the default admin interface made customizable by the admin itself. popup windows replaced by modals. ๐ง โก
django-cache-cleaner
- clear the entire cache or individual caches easily using the admin panel or management command. ๐งนโจ
django-colorfield
- simple color field for models with a nice color-picker in the admin. ๐จ
django-extra-settings
- config and manage typed extra settings using just the django admin. โ๏ธ
django-redirects
- redirects with full control. โช๏ธ
django-treenode
- probably the best abstract model / admin for your tree based stuff. ๐ณ
python-benedict
- dict subclass with keylist/keypath support, I/O shortcuts (base64, csv, json, pickle, plist, query-string, toml, xml, yaml) and many utilities. ๐
python-codicefiscale
- encode/decode Italian fiscal codes - codifica/decodifica del Codice Fiscale. ๐ฎ๐น ๐ณ
python-fontbro
- friendly font operations. ๐งข
python-fsutil
- file-system utilities for lazy devs. ๐งโโ๏ธ
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4