Home > database >  CRUD with flask rookie mistake
CRUD with flask rookie mistake

Time:09-22

This is the thing, I was trying to make a crud for a rest api for a movie app, I was able to successfully perform the functionalities with flask to create a movie within the json, to delete a movie, and to list them, but I have problems with being able to edit one of the movies inside the JSON since I don't know how to access a sector of it to be able to modify it, this is what I was trying:

    def __init__(self, idpelicula, nombre, descripcion, elenco, restriccionedad, fecha, calificacion):
        self.idpelicula = idpelicula
        self.nombre = nombre
        self.descripcion = descripcion
        self.elenco = elenco
        self.restriccionedad = restriccionedad
        self.fecha = fecha
        self.calificacion = calificacion


movies_list = [
    Peliculas(1, "Shrek", "Pelicula de Ogro", "Shrek, Fiona", " APTA", "2001", "10"),
    Peliculas(2, "Shrek2", "Otra Pelicula de Ogro", "Shrek, Fiona", " APTA", "2005", "10"),
]


@app.route("/movies")
def list_movies():
    return jsonify([pelicula.__dict__ for pelicula in movies_list])


@app.route("/movies/<id_search_movie>")
def obtener_pelicula(id_search_movie):
    for pelicula in movies_list:
        if pelicula.idpelicula == int(id_search_movie):
            return jsonify(pelicula.__dict__)
    return "Pelicula no encontrada", 404


@app.route("/movies", methods=['POST'])
def create_movie():
    movie_data = request.get_json()
    new_movie = Peliculas(movie_data["idpelicula"], movie_data["nombre"], movie_data["descripcion"],
                          movie_data["elenco"], movie_data["restriccionedad"], movie_data["fecha"],
                          movie_data["calificacion"])
    movies_list.append(new_movie)
    return "OK", 200


@app.route("/movies/<id_delete_movie>", methods=['DELETE'])
def delete_movie(id_delete_movie):
    for pelicula in movies_list:
        if pelicula.idpelicula == int(id_delete_movie):
            movies_list.remove(pelicula)
    return "OK", 200

This is what I dont know how to do, (I know its wrong, and that this isn't even the logic to do this), but this is what I tried:

@app.route("/movies", methods=['PUT'])
def edit_movie():
    movie_data = request.get_json()
    new_movie = Peliculas(movie_data["idpelicula"], movie_data["nombre"], movie_data["descripcion"],
                          movie_data["elenco"], movie_data["restriccionedad"], movie_data["fecha"],
                          movie_data["calificacion"])
    movies_list.append(new_movie)
    return "OK", 200

Any help, even from the point of view of the logic behind doing this will come handy. Thanks to you all.

CodePudding user response:

There is a ton of problems with the way you are coding this at the moment, but here i will show you how you can edit an object in the way you are currently doing it.

So with your approach the edit view should be like this:

@app.route("/movies", methods=['PUT'])
def edit_movie():
    # Accessing data from request
    movie_data = request.get_json()
    # Accesing Object from the movie-list by ID
    for movie in movies_list:
        if movie.idpelicula == movie_data["idpelicula"]:
            edited_movie = movie
    # Modifying the object attributes
    for name, value in movie_data.items():
         if hasattr(edited_movie, name):
            setattr(edited_movie, name, value)


    return "OK", 200

The problem here is that you were creating a new instance instead of editing an existing one.

in the future you could explore the usage of SQLAlchemy models so you can persist the data in a database, and still be managing objects.

PD1: Finally i recommend you be coherent with the naming, by this i mean if you are calling your variables and classes in spanish Pelicula, peliculas, try to use the same naming throught all your code, same if you use english.

PD2: Study some basic python usage of classes and variable assignment, so you can improve your code.

Greetings from Chile.

  • Related