Грубая ошибка новичка с фляжкой

#python #flask

Вопрос:

Вот в чем дело, я пытался создать crud для api rest для приложения для фильмов, я смог успешно выполнить функции с помощью flask для создания фильма в json, удаления фильма и их перечисления, но у меня возникли проблемы с возможностью редактирования одного из фильмов в JSON, так как я не знаю, как получить доступ к его сектору, чтобы иметь возможность его изменить, вот что я пытался сделать.:

     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
 

Это то, что я не знаю, как сделать (я знаю, что это неправильно, и что это даже не логика для этого), но это то, что я пытался:

 @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
 

Любая помощь, даже с точки зрения логики, лежащей в основе этого, пригодится. Спасибо вам всем.

Ответ №1:

В данный момент существует масса проблем с тем, как вы это кодируете, но здесь я покажу вам, как вы можете редактировать объект так, как вы это делаете в настоящее время.

Поэтому при вашем подходе представление редактирования должно быть таким:

 @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
 

Проблема здесь в том, что вы создавали новый экземпляр вместо редактирования существующего.

в будущем вы могли бы изучить использование моделей SQLAlchemy, чтобы вы могли сохранять данные в базе данных и по-прежнему управлять объектами.

PD1: Наконец, я рекомендую вам быть последовательным в именовании, под этим я подразумеваю, что если вы вызываете свои переменные и классы на испанском языке Pelicula, peliculas, попробуйте использовать одно и то же имя во всем своем коде, то же самое, если вы используете английский.

PD2: Изучите некоторые основы использования классов и присвоения переменных в python, чтобы вы могли улучшить свой код.

Привет из Чили.

Комментарии:

1. Я знаю, я нахожусь в своем 3-м или 4-м классе python, ха-ха, и я примерно смог написать этот код, ха-ха-ха, большое вам спасибо, и вы правы, что мне придется поддерживать согласованность с именами. Мы очень признательны за помощь. Привет из Уругвая.