I am having difficulty over generating api endpoint urls in nested output fields using [Flask-RESTful][1].
I found that fields.Url('my_endpoint', absolute=True)
only generates url inside top url fields not the nested one. It throws werkzeug.routing.BuildError
- [Error log gist][1]https://gist.github.com/anonymous/6251c67089871d0e4516
For example here is my url fields
role_fields = {
'name': fields.String(attribute='title'),
'id': fields.Integer(attribute='id'),
'uri': fields.Url('user_endpoint', absolute=True)
}
user_fields = {
'id': fields.Integer,
'username': fields.String,
'email': fields.String,
'full_name': fields.String(attribute='real_name'),
'website': fields.String(default=None),
'bio': fields.String(default=None),
'created_date': fields.DateTime,
'modified_date': fields.DateTime,
'uri': fields.Url('user_endpoint', absolute=True),
'role': fields.Nested(role_fields),
}
The problem was fields.Url
needs a required endpoint parameter, In this case its username
.
The parameter username
is available to user_fields
with the returned user
object, but the role
object user.role
does not contain username
attribute.
So I assigned 'usernameattribute to
user.role` object before returning it.
user = get_user(username) #Get user object from db
user.role.username = user.username
return user