Opened 3 years ago
Last modified 3 years ago
#33295 closed Bug
Django throws an error when a list is passed into self.stdout.write for writing message into the terminal — at Initial Version
Reported by: | Vishal Pandey | Owned by: | nobody |
---|---|---|---|
Component: | Core (Management commands) | Version: | 3.2 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | yes | UI/UX: | no |
Description
class Command(BaseCommand): def handle(self, *args, **kwargs): self.stdout.write([1,2,3])
The following piece of code throws an Attribute error stating that list' object has no attribute 'endswith', it is because the datatype of msg is not checked in handle function while writing the source code.
Here is the full traceback of the error
Traceback (most recent call last): File "manage.py", line 22, in <module> main() File "manage.py", line 18, in main execute_from_command_line(sys.argv) File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line utility.execute() File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv self.execute(*args, **cmd_options) File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute output = self.handle(*args, **options) File "/home/vishal/Desktop/open_source/leetcode_companywise/questions/management/commands/addcompanies.py", line 18, in handle self.stdout.write([1,2,3]) File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 144, in write if ending and not msg.endswith(ending): AttributeError: 'list' object has no attribute 'endswith'
It can be fixed if we just ensure the datatype of the msg is string and handle it accordingly with
isinstance(msg, str)
in line 151 of /django/core/management/base.py.
After handling this error a proper error message(i.e. TypeError) will be shown on the terminal of the user which is more appropriate in this situation.
New traceback:
Traceback (most recent call last): File "manage.py", line 22, in <module> main() File "manage.py", line 18, in main execute_from_command_line(sys.argv) File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line utility.execute() File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv self.execute(*args, **cmd_options) File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute output = self.handle(*args, **options) File "/home/vishal/Desktop/open_source/leetcode_companywise/questions/management/commands/addcompanies.py", line 18, in handle self.stdout.write([1,2,3]) File "/home/vishal/.local/lib/python3.8/site-packages/django/core/management/base.py", line 147, in write self._out.write(style_func(msg)) TypeError: write() argument must be str, not list
First traceback is the current output and second traceback is the new output after handling the bug