2 votes

Python NeoModel : comment retourner le résultat d'une requête en tant qu'objet JSON ?

Je suis assez novice en Python et dans mon application j'utilise Neomodel pour charger et récupérer les données des graphes depuis la base de données Neo4j.

Dans l'une de mes routes, j'ai la fonction suivante :

@api_mod.route('/users')                                                            
def get_users():                                                                                                                                                        
     users = User.nodes #Returns a NodeSet                                                                                                                              
     list_of_users = list(users) #Converts the NodeSet object to a list                                                                                                                                                                                                                                                                    
     return json.dumps(dict(users = [user for user in list_of_users]))    

Ma classe d'utilisateur est définie comme suit :

class User(StructuredNode):
    user_id = StringProperty(unique_index=True, required=True)
    logged_in = RelationshipTo('Environment', 'LOGGED_IN', model=LoginAction)
    launched = RelationshipTo('Application', 'LAUNCHED', model=LaunchedAction)
    entered = RelationshipTo('Application', 'ENTERED', model=EnteredAction)
    accessed = RelationshipTo('Application', 'ACCESSED', model=AccessedAction)
    exited = RelationshipTo('Application', 'EXITED', model=ExitedAction)
    logged_out = RelationshipTo('Environment', 'LOGGED_OUT', model=LogoutAction)
    timed_out = RelationshipTo('Environment', 'TIME_OUT', model=TimeoutAction)

    def toJSON(self):
        return dict(user_id = self.user_id)

Je m'attends à ce que ma route /users renvoie un objet JSON contenant tous les utilisateurs de la base de données. Je comprends que l'objet NodeSet ne peut pas être sérialisé en un objet JSON, d'où ma tentative de le convertir en une liste. Mais maintenant, lorsque j'exécute, j'obtiens l'erreur suivante : "TypeError : Object of type 'User' is not JSON serializable".

et voici la trace complète de la pile : Traceback (dernier appel le plus récent) : File "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py", line 1997, in appelez return self.wsgi_app(environ, start_response) Fichier "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py", ligne 1985, in wsgi_app response = self.handle_exception(e) File "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception reraise(exc_type, exc_value, tb) Fichier "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/_compat.py", ligne 33, in reraise raise valeur Fichier "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py", ligne 1982, dans wsgi_app response = self.full_dispatch_request() File "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request rv = self.handle_user_exception(e) Fichier "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py", ligne 1517, in handle_user_exception reraise(exc_type, exc_value, tb) Fichier "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/_compat.py", ligne 33, in reraise raise valeur Fichier "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py", ligne 1612, in full_dispatch_request rv = self.dispatch_request() Fichier "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py", ligne 1598, in dispatch_request return self.view_functionsrule.endpoint Fichier "/Users/mdebarros/PycharmProjects/useractivitylogs/app/api/routes.py", ligne 16, dans get_users return json.dumps(dict(users = [user for user in list_of_users])) Fichier "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/ init .py", ligne 231, dans dumps return _default_encoder.encode(obj) Fichier "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", ligne 199, in encode chunks = self.iterencode(o, _one_shot=True) Fichier "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", ligne 257, in iterencode return _iterencode(o, 0) Fichier "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", ligne 180, dans default o. classe . nom ) TypeError : L'objet de type 'User' n'est pas sérialisable en JSON.

Avez-vous de l'aide ou des suggestions sur la façon dont je peux gérer cela et retourner un objet JSON correct ?

Merci d'avance pour toute aide.

--MD

1voto

Coding Points 26

Comme vous le savez, il est nécessaire est que la classe utilisateur Model a une méthode pour effectuer le processus de traduction des structures de données (sérialisation), pour résoudre, une solution est d'ajouter une méthode qui fait cela :

class User(StructuredNode):
    user_id = StringProperty(unique_index=True, required=True)
    logged_in = RelationshipTo('Environment', 'LOGGED_IN', model=LoginAction)
    launched = RelationshipTo('Application', 'LAUNCHED', model=LaunchedAction)
    entered = RelationshipTo('Application', 'ENTERED', model=EnteredAction)
    accessed = RelationshipTo('Application', 'ACCESSED', model=AccessedAction)
    exited = RelationshipTo('Application', 'EXITED', model=ExitedAction)
    logged_out = RelationshipTo('Environment', 'LOGGED_OUT', model=LogoutAction)
    timed_out = RelationshipTo('Environment', 'TIME_OUT', model=TimeoutAction)

@property
def serialize(self):
    return {
        'user_id': self.user_id,
        'logged_in': self.logged_in,
        'launched': self.launched,
        'entered': self.entered,
        'accessed': self.accessed,
        'exited': self.exited,
        'logged_out': self.logged_out,
        'timed_out'  : self.timed_out
   }

Maintenant, comme la méthode a été ajoutée comme propriété, elle peut être appelée comme attribut :

@api_mod.route('/users')                                                            
def get_users():                                                                                                                                                        
    users = User.nodes                                                                                                                            
    list_of_users = list(users)
    return json.dumps(dict(json_users = [user.serialize for user in list_of_users]))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X