Запрос PUT для FastAPI Python

я пытаюсь запустить запрос на размещение, но я продолжаю получать объект типа ошибки «Пользователь» не имеет атрибута «first_name», когда я объявил first_name в схеме. это мой код для запроса API, который вызывает функцию update_user из сервисов.

main.py:

@app.put("/api/userUpdate/{id}", status_code=200)
async def update_User(
    id = int,
    user = _schemas.User,
    db: _orm.Session = _fastapi.Depends(_services.get_db),
):
    await _services.update_user(id, user, db)
    return {"message", "Successfully Updated"}

services.py:

async def get_user_by_id(id: int, db: _orm.Session):
    return db.query(_models.User).filter(_models.User.id == id).first()

async def update_user(id: int, user: _schemas.User, db: _orm.Session):
    user_db = await get_user_by_id(id, db)

    user_db.first_name = user.first_name
    user_db.last_name = user.last_name
    user_db.email = user.email

    db.commit()
    db.refresh(user_db)

    return _schemas.User.from_orm(user_db)

схемы.py


class _UserBase(_pydantic.BaseModel):
    email: str
    
    
class UserCreate(_UserBase):
    hashed_password: str
    first_name: str
    last_name: str
    user_role : str
    
    class Config:
        orm_mode = True


class User(_UserBase):
    id: int
    first_name: str
    last_name: str
    user_role : str

    class Config:
        orm_mode = True

модели.py

class User(_database.Base):
    __tablename__ = "users"
    id = _sql.Column(_sql.Integer, primary_key=True, index=True)
    email = _sql.Column(_sql.String, unique=True, index=True)
    hashed_password = _sql.Column(_sql.String)
    first_name = _sql.Column(_sql.String, index=True)
    last_name = _sql.Column(_sql.String, index=True)
    user_role = _sql.Column(_sql.String, index = True)
    
    leads = _orm.relationship("Lead", back_populates = "owner")

    def verify_password(self, password: str):
        return _hash.bcrypt.verify(password, self.hashed_password)

запрос из интерфейса:

const handleUpdateUser = async (e) => {
    e.preventDefault();
    const requestOptions = {
      method: "PUT",
      headers: {
        "Content-Type": "application/json",
        Authorization: "Bearer " + token,
      },
      body: JSON.stringify({
        first_name: userName,
        last_name: userSurname,
        email: userEmail,
      }),
    };
    const response = await fetch(`/api/userUpdate/${id}`, requestOptions);
    if (!response.ok) {
      setErrorMessage("Something went wrong when updating lead");
    } else {
      cleanFormData();
      handleModal();
    }
  };

при запуске запроса получаю ошибку

AttributeError: type object 'User' has no attribute 'first_name'

Определение функции для update_User() кажется очень странным. В чем смысл id = int? int - это тип. Я думаю, может быть, вы имели в виду id: int? В чем смысл user = _schemas.User? Это присваивает пользователю объект класса User. Вы намеревались использовать значение id для поиска объекта user?

John Gordon 04.04.2023 01:32

Да, я хотел использовать идентификатор для поиска объекта пользователя, а затем обновить конкретные пользовательские данные.

user15299152 04.04.2023 01:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что не так указано в сообщении об ошибке. Если вы внимательно прочитаете его, там написано «AttributeError: объект типа «Пользователь» не имеет атрибута «first_name»». Это означает, что где-то вы присваиваете переменную типу User вместо экземпляра класса User.

И я считаю, что место, где это произошло, находится в основном файле, где у вас был user = _schemas.User. Это устанавливает значение по умолчанию для user как тип _schemas.User. Я полагаю, вы пытаетесь ввести намек на то, что user будет типа _shcmas.User. Если это так, вы должны использовать двоеточие вместо равенства, например: user: _schemas.User. Вы также ставите id = int вместо id: int. Все должно работать после того, как вы исправите эти ошибки с подсказками двух типов.

@app.put("/api/userUpdate/{id}", status_code=200)
async def update_User(
    id: int,
    user: _schemas.User,
    db: _orm.Session = _fastapi.Depends(_services.get_db),
):
    await _services.update_user(id, user, db)
    return {"message", "Successfully Updated"}
{id} является компонентом URL-адреса, поэтому я вижу, что это аргумент этой функции. Но откуда должно взяться user?
John Gordon 04.04.2023 02:51

Пользователь @JohnGordon придет из тела запроса. Не обязательно указывать это в FastAPI, если тело необязательно, но если требуется, вы можете сделать from fastapi import Body, а затем user: _schemas.User = Body(...)

SimonUnderwood 04.04.2023 02:56

спасибо - функция почты работает отлично!

user15299152 04.04.2023 14:14

Другие вопросы по теме