Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flask 集合中对象列表的属性错误?_Flask_Mongoengine_Bson_Flask Restful - Fatal编程技术网

Flask 集合中对象列表的属性错误?

Flask 集合中对象列表的属性错误?,flask,mongoengine,bson,flask-restful,Flask,Mongoengine,Bson,Flask Restful,我们使用Flask Restful实现API。作为数据库,我们使用MongoDB和MongoEngine作为ODM。为了让MongoEngine与Restful一起工作,我们遵循了以下步骤。为了获得正确的json格式,我们使用内置的。这非常适用于单个对象(例如,集合中的一项),但当删除对象列表(例如,集合中的所有项)时,会引发AttributeError(尽管我们使用与单个对象相同的语法)。这就是我们的模型和视图的样子(我不粘贴路由,因为它们在一个单独的文件中,可以工作) 型号: class T

我们使用Flask Restful实现API。作为数据库,我们使用MongoDB和MongoEngine作为ODM。为了让MongoEngine与Restful一起工作,我们遵循了以下步骤。为了获得正确的json格式,我们使用内置的。这非常适用于单个对象(例如,集合中的一项),但当删除对象列表(例如,集合中的所有项)时,会引发AttributeError(尽管我们使用与单个对象相同的语法)。这就是我们的模型和视图的样子(我不粘贴路由,因为它们在一个单独的文件中,可以工作)

型号:

class Task(db.Document):
    name = db.StringField()
    description_mini = db.StringField()
观点:

parser = reqparse.RequestParser()
parser.add_argument('task_id', type=str)

task_format = {
    "name": fields.String,
    "description_mini": fields.String
}

class TasksView(Resource):

    @marshal_with(task_format)
    def get(self):
        tasks = Task.objects().all()
        return tasks, 200


class TaskDetailView(Resource):

    @marshal_with(task_format)
    def get(self):
        args = parser.parse_args()
        startup_id = args['task_id']

        task = Task.objects(id=task_id).first()

        return task, 200
完整堆栈跟踪:

AttributeError

Traceback (most recent call last)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 257, in error_router
return self.handle_error(e)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 257, in error_router
return self.handle_error(e)
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/project/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 397, in wrapper
resp = resource(*args, **kwargs)
File "/project/venv/lib/python2.7/site-packages/flask/views.py", line 84, in view
return self.dispatch_request(*args, **kwargs)
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 487, in dispatch_request
resp = meth(*args, **kwargs)
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 562, in wrapper
return marshal(data, self.fields), code, headers
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 533, in marshal
return OrderedDict(items)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/collections.py", line 52, in __init__
self.__update(*args, **kwds)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_abcoll.py", line 547, in update
for key, value in other:
File "/project/venv/lib/python2.7/site-packages/flask_restful/__init__.py", line 532, in <genexpr>
for k, v in fields.items())
File "/project/venv/lib/python2.7/site-packages/flask_restful/fields.py", line 104, in output
value = get_value(key if self.attribute is None else self.attribute, obj)
File "/project/venv/lib/python2.7/site-packages/flask_restful/fields.py", line 37, in get_value
return _get_value_for_keys(key.split('.'), obj, default)
File "/project/venv/lib/python2.7/site-packages/flask_restful/fields.py", line 42, in _get_value_for_keys
return _get_value_for_key(keys[0], obj, default)
File "/project/venv/lib/python2.7/site-packages/flask_restful/fields.py", line 51, in _get_value_for_key
return obj[key]
File "/project/venv/lib/python2.7/site-packages/mongoengine/queryset/base.py", line 152, in __getitem__
raise AttributeError
AttributeError
AttributeError
回溯(最近一次呼叫最后一次)
文件“/project/venv/lib/python2.7/site packages/flask/app.py”,第1836行,调用__
返回self.wsgi_应用程序(环境,启动响应)
wsgi_应用程序中的文件“/project/venv/lib/python2.7/site packages/flask/app.py”,第1820行
响应=self.make\u响应(self.handle\u异常(e))
文件“/project/venv/lib/python2.7/site packages/flask_restful/_init__.py”,第257行,错误
返回self.handle\u错误(e)
wsgi_应用程序中的文件“/project/venv/lib/python2.7/site packages/flask/app.py”,第1817行
response=self.full\u dispatch\u request()
文件“/project/venv/lib/python2.7/site packages/flask/app.py”,第1477行,完整发送请求
rv=自身处理用户异常(e)
文件“/project/venv/lib/python2.7/site packages/flask_restful/_init__.py”,第257行,错误
返回self.handle\u错误(e)
文件“/project/venv/lib/python2.7/site packages/flask/app.py”,第1475行,完整发送请求
rv=自我分派请求()
文件“/project/venv/lib/python2.7/site packages/flask/app.py”,第1461行,在调度请求中
返回self.view_函数[rule.endpoint](**req.view_参数)
文件“/project/venv/lib/python2.7/site packages/flask_restful/_init__.py”,第397行,包装中
resp=资源(*args,**kwargs)
文件“/project/venv/lib/python2.7/site packages/flask/views.py”,第84行,视图中
返回自发送请求(*args,**kwargs)
文件“/project/venv/lib/python2.7/site packages/flask_restful/_init__.py”,第487行,在调度请求中
resp=meth(*args,**kwargs)
文件“/project/venv/lib/python2.7/site packages/flask_restful/_init__.py”,第562行,在包装器中
返回封送处理(数据、self.fields)、代码、标头
文件“/project/venv/lib/python2.7/site packages/flask_restful/_init__.py”,第533行,封送处理
退货订单(项目)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/collections.py”,第52行,在__
自我更新(*args,**kwds)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_abcoll.py”,第547行,在更新中
对于键,其他中的值:
文件“/project/venv/lib/python2.7/site packages/flask_restful/_init__.py”,第532行,in
对于字段中的k,v.items())
文件“/project/venv/lib/python2.7/site packages/flask_restful/fields.py”,第104行,在输出中
value=get_值(如果self.attribute是None-else self.attribute,obj,则为key)
文件“/project/venv/lib/python2.7/site packages/flask\u restful/fields.py”,第37行,在get\u值中
返回\u键的\u获取\u值\u(key.split('.'),obj,默认值)
文件“/project/venv/lib/python2.7/site packages/flask\u restful/fields.py”,第42行,在“获取”键的“值”中
返回\u键的\u获取\u值\u(键[0],对象,默认值)
文件“/project/venv/lib/python2.7/site packages/flask\u restful/fields.py”,第51行,在\u key的\u get\u value\u中
返回obj[键]
文件“/project/venv/lib/python2.7/site packages/mongoengine/queryset/base.py”,第152行,在__
提高属性错误
属性错误

要封送列表,还必须将字段定义为列表

我认为这会奏效:

task_list_format = {
    'tasks': fields.List(fields.Nested(task_format))
}

class TasksView(Resource):

    @marshal_with(task_list_format)
    def get(self):
        tasks = Task.objects().all()
        return { 'tasks': tasks }, 200
我相信在Flask RESTful中使用封送处理支持返回普通列表是不可能的,它总是需要一个字典。出于这个原因,我将列表置于“任务”键下


我希望这能有所帮助。

试试
flask\u restful。用\u字段封送\u

>>> from flask_restful import marshal_with_field, fields
>>> @marshal_with_field(fields.List(fields.Integer))
... def get():
...     return ['1', 2, 3.0]
...
>>> get()
[1, 2, 3]

据我所知,问题在于mongoengine的Queryset对象懒惰地查询数据库,而Flask restful/restplus编组需要一个列表

我可以和你一起工作

task_format = {
    "name": fields.String,
    "description_mini": fields.String
}

class TasksView(Resource):

    @marshal_with(task_format)
    def get(self):
        tasks = Task.objects().all()
        return list(tasks)

什么是完整的回溯?如果不知道
AttributeError
发生在哪里以及哪个对象没有哪个属性,那么很难提供帮助。如果要编写一个发送多个任务列表的测试呢?似乎这种方法只会封送列表中的第一个对象@米格尔-有什么想法吗?我不太明白。此解决方案将封送整个列表。列表中的每个项目都将作为嵌套实体进行处理。