django-maintenance-mode


Namedjango-maintenance-mode JSON
Version 0.21.1 PyPI version JSON
download
home_page
Summaryshows a 503 error page when maintenance-mode is on.
upload_time2024-01-24 11:12:07
maintainer
docs_urlNone
author
requires_python
license
keywords django maintenance mode offline under 503 service temporarily unavailable
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![](https://img.shields.io/pypi/pyversions/django-maintenance-mode.svg?color=3776AB&logo=python&logoColor=white)](https://www.python.org/)
[![](https://img.shields.io/pypi/djversions/django-maintenance-mode?color=0C4B33&logo=django&logoColor=white&label=django)](https://www.djangoproject.com/)

[![](https://img.shields.io/pypi/v/django-maintenance-mode.svg?color=blue&logo=pypi&logoColor=white)](https://pypi.org/project/django-maintenance-mode/)
[![](https://static.pepy.tech/badge/django-maintenance-mode/month)](https://pepy.tech/project/django-maintenance-mode)
[![](https://img.shields.io/github/stars/fabiocaccamo/django-maintenance-mode?logo=github&style=flat)](https://github.com/fabiocaccamo/django-maintenance-mode/stargazers)
[![](https://img.shields.io/pypi/l/django-maintenance-mode.svg?color=blue)](https://github.com/fabiocaccamo/django-maintenance-mode/blob/main/LICENSE.txt)

[![](https://results.pre-commit.ci/badge/github/fabiocaccamo/django-maintenance-mode/main.svg)](https://results.pre-commit.ci/latest/github/fabiocaccamo/django-maintenance-mode/main)
[![](https://img.shields.io/github/actions/workflow/status/fabiocaccamo/django-maintenance-mode/test-package.yml?branch=main&label=build&logo=github)](https://github.com/fabiocaccamo/django-maintenance-mode)
[![](https://img.shields.io/codecov/c/gh/fabiocaccamo/django-maintenance-mode?logo=codecov)](https://codecov.io/gh/fabiocaccamo/django-maintenance-mode)
[![](https://img.shields.io/codacy/grade/918668ac85e74206a4d8d95923548d79?logo=codacy)](https://www.codacy.com/app/fabiocaccamo/django-maintenance-mode)
[![](https://img.shields.io/codeclimate/maintainability/fabiocaccamo/django-maintenance-mode?logo=code-climate)](https://codeclimate.com/github/fabiocaccamo/django-maintenance-mode/)
[![](https://img.shields.io/badge/code%20style-black-000000.svg?logo=python&logoColor=black)](https://github.com/psf/black)
[![](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

# django-maintenance-mode
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.

## Installation

1. Run `pip install django-maintenance-mode` or [download django-maintenance-mode](http://pypi.python.org/pypi/django-maintenance-mode) and add the **maintenance_mode** package to your project
2. Add `maintenance_mode` to `settings.INSTALLED_APPS` before custom applications
3. Add `maintenance_mode.middleware.MaintenanceModeMiddleware` to `settings.MIDDLEWARE` as last middleware
4. Add your custom `templates/503.html` file
5. Restart your application server

## Configuration (optional)

### Settings
All these settings are optional, if not defined in `settings.py` the default values (listed below) will be used.

```python
# if True the maintenance-mode will be activated
MAINTENANCE_MODE = None
```

```python
# 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"
```

```python
# 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
```

```python
# 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"
```

```python
# if True admin site will not be affected by the maintenance-mode page
MAINTENANCE_MODE_IGNORE_ADMIN_SITE = False
```

```python
# if True anonymous users will not see the maintenance-mode page
MAINTENANCE_MODE_IGNORE_ANONYMOUS_USER = False
```

```python
# if True authenticated users will not see the maintenance-mode page
MAINTENANCE_MODE_IGNORE_AUTHENTICATED_USER = False
```

```python
# if True the staff will not see the maintenance-mode page
MAINTENANCE_MODE_IGNORE_STAFF = False
```

```python
# if True the superuser will not see the maintenance-mode page
MAINTENANCE_MODE_IGNORE_SUPERUSER = False
```

```python
# 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 = ()
```

```python
# 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`](https://github.com/un33k/django-ipware):
```python
MAINTENANCE_MODE_GET_CLIENT_IP_ADDRESS = "ipware.ip.get_ip"
```

```python
# the path of the function that will return the response context -> 'myapp.mymodule.myfunction'
MAINTENANCE_MODE_GET_CONTEXT = None
```

```python
# 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 = ()
```

```python
# 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
```

```python
# if True authenticated users will be logged out from their current session
MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER = False
```

```python
# the absolute url where users will be redirected to during maintenance-mode
MAINTENANCE_MODE_REDIRECT_URL = None
```

```python
# the type of the response returned during maintenance mode, can be either "html" or "json"
MAINTENANCE_MODE_RESPONSE_TYPE = "html"
```

```python
# the template that will be shown by the maintenance-mode page
MAINTENANCE_MODE_TEMPLATE = "503.html"
```

```python
# the HTTP status code to send
MAINTENANCE_MODE_STATUS_CODE = 503
```

```python
# the value in seconds of the Retry-After header during maintenance-mode
MAINTENANCE_MODE_RETRY_AFTER = 3600 # 1 hour
```

#### Context Processors
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.

```python
TEMPLATES = [
    {
        # ...
        "OPTIONS": {
            "context_processors": [
                # ...
                "maintenance_mode.context_processors.maintenance_mode",
                # ...
            ],
        },
        # ...
    },
]
```

#### Logging
You can disable emailing 503 errors to admins while maintenance mode is enabled:

```python
LOGGING = {
    "filters": {
        "require_not_maintenance_mode_503": {
            "()": "maintenance_mode.logging.RequireNotMaintenanceMode503",
        },
        ...
    },
    "handlers": {
        ...
    },
    ...
}
```

### Context Managers
You can force a block of code execution to run under maintenance mode or not using context managers:

```python
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
```

### URLs
Add **maintenance_mode.urls** to `urls.py` if you want superusers able to set maintenance_mode using urls.

```python
urlpatterns = [
    # ...
    re_path(r"^maintenance-mode/", include("maintenance_mode.urls")),
    # ...
]
```

### Views
You can force maintenance mode on/off at view level using view decorators:

#### Function-based views

```python
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
```

#### Class-based views

```python
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"),
]
```

## Usage

### Python
```python
from maintenance_mode.core import get_maintenance_mode, set_maintenance_mode

set_maintenance_mode(True)

if get_maintenance_mode():
    set_maintenance_mode(False)
```
or
```python
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")

```

### Templates
```html
{% if maintenance_mode %}
<!-- html -->
{% endif %}
```

### Terminal

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`*.)*

### URLs
Superusers can change maintenance-mode using the following urls:

`/maintenance-mode/off/`

`/maintenance-mode/on/`

## Testing
```bash
# 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"
```

## License
Released under [MIT License](LICENSE.txt).

---

## Supporting

- :star: Star this project on [GitHub](https://github.com/fabiocaccamo/django-maintenance-mode)
- :octocat: Follow me on [GitHub](https://github.com/fabiocaccamo)
- :blue_heart: Follow me on [Twitter](https://twitter.com/fabiocaccamo)
- :moneybag: Sponsor me on [Github](https://github.com/sponsors/fabiocaccamo)

## See also

- [`django-admin-interface`](https://github.com/fabiocaccamo/django-admin-interface) - the default admin interface made customizable by the admin itself. popup windows replaced by modals. ๐Ÿง™ โšก

- [`django-colorfield`](https://github.com/fabiocaccamo/django-colorfield) - simple color field for models with a nice color-picker in the admin. ๐ŸŽจ

- [`django-extra-settings`](https://github.com/fabiocaccamo/django-extra-settings) - config and manage typed extra settings using just the django admin. โš™๏ธ

- [`django-redirects`](https://github.com/fabiocaccamo/django-redirects) - redirects with full control. โ†ช๏ธ

- [`django-treenode`](https://github.com/fabiocaccamo/django-treenode) - probably the best abstract model / admin for your tree based stuff. ๐ŸŒณ

- [`python-benedict`](https://github.com/fabiocaccamo/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`](https://github.com/fabiocaccamo/python-codicefiscale) - encode/decode Italian fiscal codes - codifica/decodifica del Codice Fiscale. ๐Ÿ‡ฎ๐Ÿ‡น ๐Ÿ’ณ

- [`python-fontbro`](https://github.com/fabiocaccamo/python-fontbro) - friendly font operations. ๐Ÿงข

- [`python-fsutil`](https://github.com/fabiocaccamo/python-fsutil) - file-system utilities for lazy devs. ๐ŸงŸโ€โ™‚๏ธ

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "django-maintenance-mode",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "Fabio Caccamo <fabio.caccamo@gmail.com>",
    "keywords": "django,maintenance,mode,offline,under,503,service,temporarily,unavailable",
    "author": "",
    "author_email": "Fabio Caccamo <fabio.caccamo@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/f0/03/d4426170434ec066158c84e4a7c9d2b6bd09b9e4f3ee876313f4b14b337a/django-maintenance-mode-0.21.1.tar.gz",
    "platform": null,
    "description": "[![](https://img.shields.io/pypi/pyversions/django-maintenance-mode.svg?color=3776AB&logo=python&logoColor=white)](https://www.python.org/)\n[![](https://img.shields.io/pypi/djversions/django-maintenance-mode?color=0C4B33&logo=django&logoColor=white&label=django)](https://www.djangoproject.com/)\n\n[![](https://img.shields.io/pypi/v/django-maintenance-mode.svg?color=blue&logo=pypi&logoColor=white)](https://pypi.org/project/django-maintenance-mode/)\n[![](https://static.pepy.tech/badge/django-maintenance-mode/month)](https://pepy.tech/project/django-maintenance-mode)\n[![](https://img.shields.io/github/stars/fabiocaccamo/django-maintenance-mode?logo=github&style=flat)](https://github.com/fabiocaccamo/django-maintenance-mode/stargazers)\n[![](https://img.shields.io/pypi/l/django-maintenance-mode.svg?color=blue)](https://github.com/fabiocaccamo/django-maintenance-mode/blob/main/LICENSE.txt)\n\n[![](https://results.pre-commit.ci/badge/github/fabiocaccamo/django-maintenance-mode/main.svg)](https://results.pre-commit.ci/latest/github/fabiocaccamo/django-maintenance-mode/main)\n[![](https://img.shields.io/github/actions/workflow/status/fabiocaccamo/django-maintenance-mode/test-package.yml?branch=main&label=build&logo=github)](https://github.com/fabiocaccamo/django-maintenance-mode)\n[![](https://img.shields.io/codecov/c/gh/fabiocaccamo/django-maintenance-mode?logo=codecov)](https://codecov.io/gh/fabiocaccamo/django-maintenance-mode)\n[![](https://img.shields.io/codacy/grade/918668ac85e74206a4d8d95923548d79?logo=codacy)](https://www.codacy.com/app/fabiocaccamo/django-maintenance-mode)\n[![](https://img.shields.io/codeclimate/maintainability/fabiocaccamo/django-maintenance-mode?logo=code-climate)](https://codeclimate.com/github/fabiocaccamo/django-maintenance-mode/)\n[![](https://img.shields.io/badge/code%20style-black-000000.svg?logo=python&logoColor=black)](https://github.com/psf/black)\n[![](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\n# django-maintenance-mode\ndjango-maintenance-mode shows a 503 error page when **maintenance-mode** is **on**.\n\nIt works at application level, so your django instance should be up.\n\nIt doesn't use database and doesn't prevent database access.\n\n## Installation\n\n1. Run `pip install django-maintenance-mode` or [download django-maintenance-mode](http://pypi.python.org/pypi/django-maintenance-mode) and add the **maintenance_mode** package to your project\n2. Add `maintenance_mode` to `settings.INSTALLED_APPS` before custom applications\n3. Add `maintenance_mode.middleware.MaintenanceModeMiddleware` to `settings.MIDDLEWARE` as last middleware\n4. Add your custom `templates/503.html` file\n5. Restart your application server\n\n## Configuration (optional)\n\n### Settings\nAll these settings are optional, if not defined in `settings.py` the default values (listed below) will be used.\n\n```python\n# if True the maintenance-mode will be activated\nMAINTENANCE_MODE = None\n```\n\n```python\n# by default, to get/set the state value a local file backend is used\n# if you want to use the db or cache, you can create a custom backend\n# custom backends must extend 'maintenance_mode.backends.AbstractStateBackend' class\n# and implement get_value(self) and set_value(self, val) methods\nMAINTENANCE_MODE_STATE_BACKEND = \"maintenance_mode.backends.LocalFileBackend\"\n\n# alternatively it is possible to use the default storage backend\nMAINTENANCE_MODE_STATE_BACKEND = \"maintenance_mode.backends.DefaultStorageBackend\"\n\n# alternatively it is possible to use the static storage backend\n# make sure that STATIC_ROOT and STATIC_URL are also set\nMAINTENANCE_MODE_STATE_BACKEND = \"maintenance_mode.backends.StaticStorageBackend\"\n\n# alternatively it is possible to use the cache backend\n# you can use a custom cache backend by adding a `maintenance_mode` entry to `settings.CACHES`,\n# otherwise the default cache backend will be used.\nMAINTENANCE_MODE_STATE_BACKEND = \"maintenance_mode.backends.CacheBackend\"\n```\n\n```python\n# the fallback value that backends will return in case of failure\n# (actually this is only used by \"maintenance_mode.backends.CacheBackend\")\nMAINTENANCE_MODE_STATE_BACKEND_FALLBACK_VALUE = False\n```\n\n```python\n# by default, a file named \"maintenance_mode_state.txt\" will be created in the settings.py directory\n# you can customize the state file path in case the default one is not writable\nMAINTENANCE_MODE_STATE_FILE_PATH = \"maintenance_mode_state.txt\"\n```\n\n```python\n# if True admin site will not be affected by the maintenance-mode page\nMAINTENANCE_MODE_IGNORE_ADMIN_SITE = False\n```\n\n```python\n# if True anonymous users will not see the maintenance-mode page\nMAINTENANCE_MODE_IGNORE_ANONYMOUS_USER = False\n```\n\n```python\n# if True authenticated users will not see the maintenance-mode page\nMAINTENANCE_MODE_IGNORE_AUTHENTICATED_USER = False\n```\n\n```python\n# if True the staff will not see the maintenance-mode page\nMAINTENANCE_MODE_IGNORE_STAFF = False\n```\n\n```python\n# if True the superuser will not see the maintenance-mode page\nMAINTENANCE_MODE_IGNORE_SUPERUSER = False\n```\n\n```python\n# list of ip-addresses that will not be affected by the maintenance-mode\n# ip-addresses will be used to compile regular expressions objects\nMAINTENANCE_MODE_IGNORE_IP_ADDRESSES = ()\n```\n\n```python\n# the path of the function that will return the client IP address given the request object -> 'myapp.mymodule.myfunction'\n# the default function ('maintenance_mode.utils.get_client_ip_address') returns request.META['REMOTE_ADDR']\n# in some cases the default function returns None, to avoid this scenario just use 'django-ipware'\nMAINTENANCE_MODE_GET_CLIENT_IP_ADDRESS = None\n```\nRetrieve user's real IP address using [`django-ipware`](https://github.com/un33k/django-ipware):\n```python\nMAINTENANCE_MODE_GET_CLIENT_IP_ADDRESS = \"ipware.ip.get_ip\"\n```\n\n```python\n# the path of the function that will return the response context -> 'myapp.mymodule.myfunction'\nMAINTENANCE_MODE_GET_CONTEXT = None\n```\n\n```python\n# list of urls that will not be affected by the maintenance-mode\n# urls will be used to compile regular expressions objects\nMAINTENANCE_MODE_IGNORE_URLS = ()\n```\n\n```python\n# if True the maintenance mode will not return 503 response while running tests\n# useful for running tests while maintenance mode is on, before opening the site to public use\nMAINTENANCE_MODE_IGNORE_TESTS = False\n```\n\n```python\n# if True authenticated users will be logged out from their current session\nMAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER = False\n```\n\n```python\n# the absolute url where users will be redirected to during maintenance-mode\nMAINTENANCE_MODE_REDIRECT_URL = None\n```\n\n```python\n# the type of the response returned during maintenance mode, can be either \"html\" or \"json\"\nMAINTENANCE_MODE_RESPONSE_TYPE = \"html\"\n```\n\n```python\n# the template that will be shown by the maintenance-mode page\nMAINTENANCE_MODE_TEMPLATE = \"503.html\"\n```\n\n```python\n# the HTTP status code to send\nMAINTENANCE_MODE_STATUS_CODE = 503\n```\n\n```python\n# the value in seconds of the Retry-After header during maintenance-mode\nMAINTENANCE_MODE_RETRY_AFTER = 3600 # 1 hour\n```\n\n#### Context Processors\nAdd **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.\n\n```python\nTEMPLATES = [\n    {\n        # ...\n        \"OPTIONS\": {\n            \"context_processors\": [\n                # ...\n                \"maintenance_mode.context_processors.maintenance_mode\",\n                # ...\n            ],\n        },\n        # ...\n    },\n]\n```\n\n#### Logging\nYou can disable emailing 503 errors to admins while maintenance mode is enabled:\n\n```python\nLOGGING = {\n    \"filters\": {\n        \"require_not_maintenance_mode_503\": {\n            \"()\": \"maintenance_mode.logging.RequireNotMaintenanceMode503\",\n        },\n        ...\n    },\n    \"handlers\": {\n        ...\n    },\n    ...\n}\n```\n\n### Context Managers\nYou can force a block of code execution to run under maintenance mode or not using context managers:\n\n```python\nfrom maintenance_mode.core import maintenance_mode_off, maintenance_mode_on\n\nwith maintenance_mode_on():\n    # do stuff\n    pass\n\nwith maintenance_mode_off():\n    # do stuff\n    pass\n```\n\n### URLs\nAdd **maintenance_mode.urls** to `urls.py` if you want superusers able to set maintenance_mode using urls.\n\n```python\nurlpatterns = [\n    # ...\n    re_path(r\"^maintenance-mode/\", include(\"maintenance_mode.urls\")),\n    # ...\n]\n```\n\n### Views\nYou can force maintenance mode on/off at view level using view decorators:\n\n#### Function-based views\n\n```python\nfrom maintenance_mode.decorators import force_maintenance_mode_off, force_maintenance_mode_on\n\n@force_maintenance_mode_off\ndef my_view_a(request):\n    # never return 503 response\n    pass\n\n@force_maintenance_mode_on\ndef my_view_b(request):\n    # always return 503 response\n    pass\n```\n\n#### Class-based views\n\n```python\nfrom maintenance_mode.decorators import force_maintenance_mode_off, force_maintenance_mode_on\n\nurlpatterns = [\n    # never return 503 response\n    path(\"\", force_maintenance_mode_off(YourView.as_view()), name=\"my_view\"),\n\n    # always return 503 response\n    path(\"\", force_maintenance_mode_on(YourView.as_view()), name=\"my_view\"),\n]\n```\n\n## Usage\n\n### Python\n```python\nfrom maintenance_mode.core import get_maintenance_mode, set_maintenance_mode\n\nset_maintenance_mode(True)\n\nif get_maintenance_mode():\n    set_maintenance_mode(False)\n```\nor\n```python\nfrom django.core.management import call_command\nfrom django.core.management.base import BaseCommand\n\n\nclass Command(BaseCommand):\n\n    def handle(self, *args, **options):\n\n        call_command(\"maintenance_mode\", \"on\")\n\n        # call your command(s)\n\n        call_command(\"maintenance_mode\", \"off\")\n\n```\n\n### Templates\n```html\n{% if maintenance_mode %}\n<!-- html -->\n{% endif %}\n```\n\n### Terminal\n\nRun ``python manage.py maintenance_mode <on|off>``\n\n*(**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`*.)*\n\n### URLs\nSuperusers can change maintenance-mode using the following urls:\n\n`/maintenance-mode/off/`\n\n`/maintenance-mode/on/`\n\n## Testing\n```bash\n# clone repository\ngit clone https://github.com/fabiocaccamo/django-maintenance-mode.git && cd django-maintenance-mode\n\n# create virtualenv and activate it\npython -m venv venv && . venv/bin/activate\n\n# upgrade pip\npython -m pip install --upgrade pip\n\n# install requirements\npip install -r requirements.txt -r requirements-test.txt\n\n# install pre-commit to run formatters and linters\npre-commit install --install-hooks\n\n# run tests\ntox\n# or\npython runtests.py\n# or\npython -m django test --settings \"tests.settings\"\n```\n\n## License\nReleased under [MIT License](LICENSE.txt).\n\n---\n\n## Supporting\n\n- :star: Star this project on [GitHub](https://github.com/fabiocaccamo/django-maintenance-mode)\n- :octocat: Follow me on [GitHub](https://github.com/fabiocaccamo)\n- :blue_heart: Follow me on [Twitter](https://twitter.com/fabiocaccamo)\n- :moneybag: Sponsor me on [Github](https://github.com/sponsors/fabiocaccamo)\n\n## See also\n\n- [`django-admin-interface`](https://github.com/fabiocaccamo/django-admin-interface) - the default admin interface made customizable by the admin itself. popup windows replaced by modals. \ud83e\uddd9 \u26a1\n\n- [`django-colorfield`](https://github.com/fabiocaccamo/django-colorfield) - simple color field for models with a nice color-picker in the admin. \ud83c\udfa8\n\n- [`django-extra-settings`](https://github.com/fabiocaccamo/django-extra-settings) - config and manage typed extra settings using just the django admin. \u2699\ufe0f\n\n- [`django-redirects`](https://github.com/fabiocaccamo/django-redirects) - redirects with full control. \u21aa\ufe0f\n\n- [`django-treenode`](https://github.com/fabiocaccamo/django-treenode) - probably the best abstract model / admin for your tree based stuff. \ud83c\udf33\n\n- [`python-benedict`](https://github.com/fabiocaccamo/python-benedict) - dict subclass with keylist/keypath support, I/O shortcuts (base64, csv, json, pickle, plist, query-string, toml, xml, yaml) and many utilities. \ud83d\udcd8\n\n- [`python-codicefiscale`](https://github.com/fabiocaccamo/python-codicefiscale) - encode/decode Italian fiscal codes - codifica/decodifica del Codice Fiscale. \ud83c\uddee\ud83c\uddf9 \ud83d\udcb3\n\n- [`python-fontbro`](https://github.com/fabiocaccamo/python-fontbro) - friendly font operations. \ud83e\udde2\n\n- [`python-fsutil`](https://github.com/fabiocaccamo/python-fsutil) - file-system utilities for lazy devs. \ud83e\udddf\u200d\u2642\ufe0f\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "shows a 503 error page when maintenance-mode is on.",
    "version": "0.21.1",
    "project_urls": {
        "Documentation": "https://github.com/fabiocaccamo/django-maintenance-mode#readme",
        "Download": "https://github.com/fabiocaccamo/django-maintenance-mode/releases",
        "Funding": "https://github.com/sponsors/fabiocaccamo/",
        "Homepage": "https://github.com/fabiocaccamo/django-maintenance-mode",
        "Issues": "https://github.com/fabiocaccamo/django-maintenance-mode/issues",
        "Twitter": "https://twitter.com/fabiocaccamo"
    },
    "split_keywords": [
        "django",
        "maintenance",
        "mode",
        "offline",
        "under",
        "503",
        "service",
        "temporarily",
        "unavailable"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "277bb4d648a9fe8d450dd55e10527fbbb37d2c16dc366c9b7fa67b103404cd29",
                "md5": "c90f6f1ed46eb96212184a4508c66fcd",
                "sha256": "c02fff0e386b7f8b2ab54479d3a0d336ae34014da22a7a2365ca96d5a2c1db94"
            },
            "downloads": -1,
            "filename": "django_maintenance_mode-0.21.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c90f6f1ed46eb96212184a4508c66fcd",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 16469,
            "upload_time": "2024-01-24T11:12:05",
            "upload_time_iso_8601": "2024-01-24T11:12:05.571225Z",
            "url": "https://files.pythonhosted.org/packages/27/7b/b4d648a9fe8d450dd55e10527fbbb37d2c16dc366c9b7fa67b103404cd29/django_maintenance_mode-0.21.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f003d4426170434ec066158c84e4a7c9d2b6bd09b9e4f3ee876313f4b14b337a",
                "md5": "71a14f9a5f64e7b0a10684ad16e2c9fa",
                "sha256": "b79afddb671c59972ae542e4fafbc99117d2d37991843eaaa837e328eed12b1b"
            },
            "downloads": -1,
            "filename": "django-maintenance-mode-0.21.1.tar.gz",
            "has_sig": false,
            "md5_digest": "71a14f9a5f64e7b0a10684ad16e2c9fa",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 17714,
            "upload_time": "2024-01-24T11:12:07",
            "upload_time_iso_8601": "2024-01-24T11:12:07.487461Z",
            "url": "https://files.pythonhosted.org/packages/f0/03/d4426170434ec066158c84e4a7c9d2b6bd09b9e4f3ee876313f4b14b337a/django-maintenance-mode-0.21.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-01-24 11:12:07",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "fabiocaccamo",
    "github_project": "django-maintenance-mode#readme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "tox": true,
    "lcname": "django-maintenance-mode"
}
        
Elapsed time: 0.74533s