본문 바로가기
Backend/Flask

[Flask] AttributeError: 'String' object has no attribute 'nested' 오류, marshal 오류

by 그적 2022. 5. 19.

다음과 같은 오류를 마주했다.

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1523, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1509, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "/usr/local/lib/python3.9/site-packages/flask_restx/api.py", line 403, in wrapper
    resp = resource(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/flask/views.py", line 84, in view
    return current_app.ensure_sync(self.dispatch_request)(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/flask_restx/resource.py", line 49, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/flask_restx/marshalling.py", line 268, in wrapper
    return marshal(
  File "/usr/local/lib/python3.9/site-packages/flask_restx/marshalling.py", line 58, in marshal
    out, has_wildcards = _marshal(data, fields, envelope, skip_none, mask, ordered)
  File "/usr/local/lib/python3.9/site-packages/flask_restx/marshalling.py", line 189, in _marshal
    out = OrderedDict(items) if ordered else dict(items)
  File "/usr/local/lib/python3.9/site-packages/flask_restx/marshalling.py", line 180, in <genexpr>
    else __format_field(k, v)
  File "/usr/local/lib/python3.9/site-packages/flask_restx/marshalling.py", line 174, in __format_field
    value = field.output(key, data, ordered=ordered)
  File "/usr/local/lib/python3.9/site-packages/flask_restx/fields.py", line 356, in output
    return [marshal(value, self.container.nested)]
AttributeError: 'String' object has no attribute 'nested

 

처음엔 헤맸는데 자세히 보니 marshal 오류를 확인할 수 있었다.

MVC 패턴을 적용하기 위해 marshal_with( ... )에서 선언한 데이터 포맷과 실제 리턴되는 값이 맞지 않는 것이었다.

 

marshal_with 데코레이터는 응답 형식을 지정하고, 선언한 이름과 속성으로 JSON 객체를 반환하게 한다.

이때 선언한 테이터 타입을 맞춰주어야한다.

 

구체적으로 나는 아래와 같이 List<String> 타입으로 marshal 데코레이터에서 각 필드를 선언했다.

하지만 BrowseAll 클래스 리턴되는 몇 필드 값이 String으로 반환되는 오류를 범했기에 marshal 오류가 발생했던 것이다.

보면 result = ~ 를 보면 String 타입인 os, vendor, product 변수로 들어가 있었다.

따라서 [ ] 로 묶어주어 List로 반환될 수 있도록 했다~ 오류 끝

 

댓글