首页 > 解决方案 > 属性错误:“dict”对象没有属性“endswith”

问题描述

(y) xlm@d8cb8a102c73:~/workspace/y-server/y$ ./manage.py 
 run_algorithm --settings=y.settings.local
Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/xlm/.virtualenvs/y/lib/python3.5/site- 
packages/django/core/management/__init__.py", line 354, in 
execute_from_command_line
    utility.execute()
  File "/home/xlm/.virtualenvs/y/lib/python3.5/site- 
packages/django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/xlm/.virtualenvs/y/lib/python3.5/site- 
packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/xlm/.virtualenvs/y/lib/python3.5/site- 
packages/django/core/management/base.py", line 454, in execute
    self.stdout.write(output)
  File "/home/xlm/.virtualenvs/y/lib/python3.5/site- 
packages/django/core/management/base.py", line 111, in write
    if ending and not msg.endswith(ending):
AttributeError: 'dict' object has no attribute 'endswith'

我正在尝试在 django 框架上使用命令文件 run_algorithm.py(如下)运行文件 algorithm.py。但是我得到了上述属性错误,我不确定为什么。

import logging
from django.conf import settings
from django.core.management.base import BaseCommand
from ...algorithm import engagement_level_mapping
logger = logging.getLogger(settings.LOGGER_NAME)


class Command(BaseCommand):
     help = "TODO: describe"
     def handle(self, *args, **options):
        result = engagement_level_mapping()
        return result

但是,当打印结果时,文件会正确执行,而不是返回。

import logging
from django.conf import settings
from django.core.management.base import BaseCommand
from ...algorithm import engagement_level_mapping
logger = logging.getLogger(settings.LOGGER_NAME)


class Command(BaseCommand):
     help = "TODO: describe"
     def handle(self, *args, **options):
        result = engagement_level_mapping()
        print(result)

命令文件为每个用户打印一个参与度值的字典(不是那么相关,只是它打印一个字典)。

这是base.py中的代码

标签: pythondjango

解决方案


您收到此错误是因为 django 管理命令的handle()方法不应该返回任何内容,而是返回字符串 - 如果您阅读回溯,您很容易发现错误发生在基类中(在 django/core/management/base.pydjango/ core/management/base.py),它试图打印出你的命令返回的值。

关键是从管理命令返回任何其他内容是没有意义的:管理命令是一个命令行工具,并且预期会产生副作用(修改数据库/文件系统/等中的某些内容)或生成一些可以显示或馈送到另一个命令行程序的文本输出(在 unix 传统中,您将命令连接在一起)。

修复很明显:在返回结果之前将结果格式化为字符串,即(使用 json 输出的示例,但您可以选择生成 csv 或 xml 或任何适合您的内容):

import json

class Command(BaseCommand):
     help = "TODO: describe"
     def handle(self, *args, **options):
        result = engagement_level_mapping()
        return json.dumps(result, indent=2)

推荐阅读