A Django Admin Web Shell using Xterm.js and Django Channels.
MIT License
A Django Web Shell using Xterm.js and Django Channels.
Note: This package depends on websockets therefore you'll need to use an ASGI application to use it. If you are not using Django channels then read through the official Channels' documentation on installing Channels, also see the Channels' documentation on running ASGI applications.
The demo is from Django.wtf's admin.
Install the package using pip:
pip install django-admin-shellx
Add django_admin_shellx
to your INSTALLED_APPS
:
INSTALLED_APPS = [
# ...
'django_admin_shellx',
# ...
]
The package uses websockets for real-time communication between a pseudo-shell on the server and Xterm.js in the browser. Django doesn't handle websockets natively, so we have to deploy a second WSGI server for this purpose.
We will have to add an ASGI configuration file for the websocket server:
import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application
# Follows the path of cookiecutter-django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
# The ASGI application
django_application = get_asgi_application()
# Remember to import the urlpatters after the asgi application!
# pylint: disable=wrong-import-position
from django_admin_shellx.urls import websocket_urlpatterns
application = ProtocolTypeRouter(
{
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(URLRouter(websocket_urlpatterns))
),
}
)
When running the server in production you'll have:
To start the traditional server you'll use Gunicorn as usual.
To start the websocket server you use Daphne.
daphne config.asgi:application -b 0.0.0.0 -p 80
Lastly, we'll need to use a custom admin site to add a link to the terminal, add the following to your INSTALLED_APPS
:
INSTALLED_APPS = [
...
"django_admin_shellx",
"django_admin_shellx_custom_admin.apps.CustomAdminConfig",
]
Ensure to remove the default admin
app from the INSTALLED_APPS
if you are using the custom admin site.
INSTALLED_APPS = [
...
# 'django.contrib.admin',
...
]
The above is optional and only adds a view
button to the admin that links to the terminal. Otherwise, there will not be a link since it's not a model and can not be added to the admin. The terminal will either be accessible through the path /admin/django_admin_shellx/terminalcommand/terminal/
and if you use the custom admin site, it will be accessible through a link in the admin.
Head over to the admin and click on the Terminal
link. You'll be presented with a terminal that you can use to run commands. The default commands are ./manage.py shell_plus
, ./manage.py shell
and /bin/bash
. You can change the default commands by setting the DJANGO_ADMIN_SHELLX_COMMAND
setting.
Each command is saved in the database and can be accessed through the admin. You can also add new commands through the admin and favorite existing commands. Each command ran is also saved as a LogEntry.
Name | Description | Type | Default | Required |
---|---|---|---|---|
DJANGO_ADMIN_SHELLX_SUPERUSER_ONLY | Only allow superusers to access the admin shellx. | boolean |
True |
no |
DJANGO_ADMIN_SHELLX_COMMANDS | The default commands to use when opening the terminal. | list[list[str]] |
[["./manage.py", "shell_plus"], ["./manage.py", "shell"], ["/bin/bash"]] | no |
DJANGO_ADMIN_SHELLX_WS_PORT | The port to use for the websocket. | int |
None | no |