Saltar al contenido

Modelos de archivos y carpetas para un simple servicio de almacenamiento de archivos usando VueJS, Flask, y RethinkDB

Lo que notará a medida que avanzamos es que los archivos de hechos se almacenan de manera plana en el sistema de archivos. Todos los usuarios tienen una carpeta donde se almacenan todos sus archivos, pero la estructura de los datos es lógica y se almacena en la base de datos. De esta manera, tenemos un mínimo de escritura en el sistema de archivos. Para ello, emplearemos algunas técnicas bastante limpias que probablemente le serán útiles para futuros proyectos.

Crear los modelos base en /api/models.py

Modelos de archivos y carpetas para un simple servicio de almacenamiento de archivos usando VueJS, Flask, y RethinkDB
Modelos de archivos y carpetas para un simple servicio de almacenamiento de archivos usando VueJS, Flask, y RethinkDB
12345classFile(RethinkDBModel): _table =$0027files$0027classFolder(File):pass

pitón

Empezamos creando el método create() para el modelo File. Este método se llamará cuando hagamos una petición POST al endpoint /usuarios//archivos/ utilizado para crear un archivo.

123456789101112131415161718192021222324252627282930@classmethoddefcreate(cls,**kwargs): nombre = kwargs.get($0027nombre$0027) tamaño = kwargs.get($0027tamaño$0027) uri = kwargs.get($0027uri$0027) padre = kwargs.get($0027padre$0027) creador = kwargs. get($0027creator$0027)# ID directo del padre parent_id =$00270$0027if parent isNoneelse parent[$0027id$0027] doc ={$0027nombre$0027: nombre,$0027tamaño$0027: tamaño,$0027uri$0027: uri,$0027parent_id$0027: parent_id,$0027creator$0027: creador,$0027is_folder$0027:Falso,$0027status$0027:Verdadero,$0027date_created$0027: fecha-hora. now(r.make_timezone($0027+01:00$0027)),$0027date_modified$0027: datetime.now(r.make_timezone($0027+01:00$0027))} res = r.table(cls._table).insert(doc).run(conn) doc[$0027id$0027]= res[$0027generated_keys$0027][0]if parent isnotNone: Folder.add_object(parent, doc[$0027id$0027])return doc

pitón

Primero, recogemos toda la información que necesitamos del diccionario de argumentos de palabras clave como nombre, tamaño, archivo URI, creador, etc. Hemos recogido un parámetro que llamamos padre. Este campo apunta al id de la carpeta en la que queremos almacenar este archivo. Podemos elegir no pasar este parámetro si queremos almacenar el archivo en la carpeta raíz. A medida que avanzamos, comprenderá cómo podemos hacer uso de esto para crear complejas estructuras de carpetas anidadas.

Fíjate aquí como tener un padre de Ninguno hace que el campo parent_id sea 0. Esto se encarga de los casos en los que se crea un archivo sin padre. Esto asume que estamos almacenando el archivo en la carpeta raíz que tendrá un ID de 0.

Recogemos toda esta información sobre el archivo en un diccionario y llamamos a la función insert() para almacenarla en la base de datos. El diccionario devuelto al llamar a la función insertar contiene los ID de los documentos recién generados. Después de insertar el diccionario, rellenamos la información del ID en el diccionario para poder devolverlo a los usuarios.

En las últimas tres líneas de este método, hemos añadido una comprobación para ver si el padre es Ninguno. Dado que esta implementación del administrador de archivos tiene carpetas, cada vez que creamos un archivo en una carpeta, lógicamente tendríamos que agregar cada objeto recién creado a una carpeta. Para ello, añadimos el ID del objeto a una lista de objetos en el registro correspondiente de la carpeta en la que intentamos almacenarlo. Esto se hace llamando a un método que crearemos en el modelo de carpetas llamado add_object.

A continuación, volveremos a nuestra clase base RethinkDBModel para crear una serie de métodos útiles que podemos o no anular en las clases para niños.

12345678910111213141516171819202122classRethinkDBModel(object): @classmethoddeffind(cls,id):return r.table(cls._table).get(id).run(conn) @classmethoddeffilter(cls,predicate):returnnlist(r.table(cls._table).filter(predicate).run(conn)) @classmethoddefupdate(cls,id, fields): status = r.table(cls._table).get(id).update(fields).run(conn)if status[$0027errors$0027]:raise DatabaseProcessError("Could not complete the update action")returnTrue @classmethoddefdelete(cls,id): status = r. table(cls._table).get(id).delete().run(conn)if status[$0027errors$0027]:raise DatabaseProcessError("Could not complete the delete action")returnTrue

pitón

Aquí creamos métodos de envoltura para las funciones get(), filter(), update() y delete() de RethinkDB. De esta manera, las subclases pueden aprovechar esas funciones para interacciones más complejas.

El siguiente método que crearemos en nuestro modelo de archivo es una función que se utilizará para mover archivos entre carpetas.

123456@classmethoddefmove(cls, obj, to): previous_folder_id = obj[$0027parent_id$0027] previous_folder = Folder.find(previous_folder_id) Folder.remove_object(previous_folder, obj[$0027id$0027]) Folder.add_object(to, obj[$0027id$0027])

pitón

La lógica aquí es bastante simple. Llamamos a este método cuando queremos mover un objeto de archivo a una carpeta.

Empezamos por obtener la identificación de la carpeta actual para el directorio padre actual del archivo. Esto se almacena en el campo parent_id de obj. Llamamos a la función de búsqueda del modelo de carpeta para obtener el objeto de la carpeta como un diccionario llamado carpeta_previa. Después de obtener este objeto, hacemos dos cosas. Eliminamos el objeto archivo de la carpeta anterior carpeta_previa, y añadimos el objeto archivo a la nueva carpeta a. Esto lo conseguimos llamando a los métodos remove_object() y add_object() de la clase Folder. Estos métodos eliminan el ID de archivo de y agregan el ID de archivo a la lista de objetos del documento Folder, respectivamente. Dentro de un momento mostraré cómo son las implementaciones de estos métodos.

Ya hemos terminado de modelar los archivos. Podemos llevar a cabo interacciones básicas en los archivos como crear, editar, borrar de la base de datos, y más.

A continuación pasamos a la lógica del modelo de la carpeta, que es muy similar a lo que hicimos con los archivos.