(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中的代码
答案 0 :(得分:1)
您会收到此错误,因为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)
答案 1 :(得分:0)
从错误中我们可以推断出您正在检查dict
中的string
而不是if condition
。检查为msg
变量分配的值。
答案 2 :(得分:0)
使用堆栈跟踪。堆栈跟踪可准确告诉您错误发生的位置以及原因。在您的计算机中,它表示它位于line 111
中的File "/home/xlm/.virtualenvs/y/lib/python3.5/site-
packages/django/core/management/base.py"
上。从细节上讲,看起来您有一个变量msg
,您希望它是一个字符串(我之所以这样认为是因为它是通过一个字符串方法来调用的。
但是,它看起来也像是django框架中的django代码块。这意味着您正在调用最终调用该代码的方法。我假设您应该传递一个字符串,但是您传递一个字典。
因此,四处寻找导致回溯的代码(我们不能在这里,因为我们没有您的整个项目,而您给我们的代码不是),然后检查您试图传递的值。