#31924 closed New feature (invalid)
Support --force-color for runserver — at Version 5
Reported by: | Zach Waggoner | Owned by: | nobody |
---|---|---|---|
Component: | Core (Management commands) | Version: | 3.1 |
Severity: | Normal | Keywords: | runserver, force_color |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Currently, the --force-color
option doesn't work for the runserver
management command. In my own experimentation, I was able to force color output by changing self.style = color_style()
to self.style = color_style(force_color=True)
in django.utils.log.ServerFormatter
. I can of course achieve this by using my own django.server formatter class, but it would be convenient to have it built in.
Change History (5)
follow-up: 2 comment:1 by , 4 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 by , 4 years ago
Replying to felixxm:
It already works properly, you just need to set the
DJANGO_COLORS
environment variable to reachServerFormatter
, see docs.
I might be missing something, but that doesn't work for me. As an example, trying to run this Procfile through honcho does not preserve the color output:
web: DJANGO_COLORS=dark python manage.py runserver
and neither does:
web: DJANGO_COLORS=dark python manage.py runserver --force-color
This is on Django 3.1.
follow-up: 4 comment:3 by , 4 years ago
It looks that Django doesn't recognize that your system's terminal supports color, we have an open ticket to improve detection on Windows, see #31216. You may also fake the installation of ANSICON
by setting the appropriate environmental variable, ANSICON="on"
. Please use one of support channels.
comment:4 by , 4 years ago
Replying to felixxm:
It looks that Django doesn't recognize that your system's terminal supports color, we have an open ticket to improve detection on Windows, see #31216. You may also fake the installation of
ANSICON
by setting the appropriate environmental variable,ANSICON="on"
. Please use one of support channels.
I'm on macOS, but I already expect that Django would not recognize that the execution context supports color because it is being run in a non-TTY context (through honcho). The point of --force-color
is to bypass the color support detection altogether and output colors anyway—that is what I'm saying doesn't work for runserver
. Running runserver
directly (not within honcho) does output colors. Furthermore, running a different management command such as migrate
with the --force-color
option within honcho preserves the color output, as expected. Therefore the problem is specific to runserver
.
I glanced through the source code, and it looks like django.core.management.base.BaseCommand
handles the --force-color
option by setting self.style = color_style(force_color)
. Then the specific commands which inherit from BaseCommand
, like migrate
, use self.style
when writing to stdout. However, runserver
, while inheriting from BaseCommand
, doesn't ever reference self.style
, nor does it do anything else with --force-color
. Instead, the style
object is defined in django.utils.log.ServerFormatter
as self.style = color_style()
, so force_color
is never True
regardless of any environment variables. That is why I said in my original comment that the current way to solve this is to override ServerFormatter
, but it seems like Django could support --force-color
for runserver
, perhaps by setting an environment variable that is picked up by the default ServerFormatter
. Or if there are reasons not to do this, then perhaps the documentation should be updated to note that runserver
does not support --force-color
. The current docs imply that all management commands support the option.
comment:5 by , 4 years ago
Description: | modified (diff) |
---|
It already works properly, you just need to set the
DJANGO_COLORS
environment variable to reachServerFormatter
, see docs.