Я изучаю FastApi и сталкиваюсь с этой проблемой

#python #python-3.x #sqlalchemy #fastapi

#питон #python-3.x #sql — алхимия #fastapi

Вопрос:

Я пытаюсь создать product API, но я сталкиваюсь с этой проблемой после отправки запроса в API:

 new_product = models.products(name=requests.name, price=requests.price)
AttributeError: module 'fastapi.requests' has no attribute 'name'
 

Это мой код:

main.py

 from fastapi import FastAPI, Depends, requests
from typing import Optional
import schemas, models
from database import engine, SessionLocal
from sqlalchemy.orm import Session

models.Base.metadata.create_all(bind=engine)

app = FastAPI()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post('/product')
def create(product: schemas.Products, db : Session = Depends(get_db)):
    new_product = models.products(name=requests.name, price=requests.price)
    db.add(new_product)
    db.commit()
    db.refresh(new_product)
    return new_product
 

models.py

 from sqlalchemy import Column, Integer, String
from database import Base

class products(Base):
    __tablename__ = 'products'
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String)
    price = Column(Integer)    
 

database.py

 from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQL_URL = 'sqlite:/// product.db'

engine = create_engine(SQL_URL, connect_args={"check_same_thread": False})

SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)

Base = declarative_base()
 

schemas.py

 from pydantic import BaseModel

class Products(BaseModel):
    name: str
    price: int
 

Ответ №1:

Если вы пытаетесь получить данные , отправленные в конечную точку API, вы должны использовать product.name and product.price вместо requests.XXX .

Вы импортируете requests из FastAPI ( from fastapi import ... requests ), и это совершенно не связано с вашим API!

Ответ №2:

Как говорит Джейсон, лучше получать информацию из схемы, но если вы хотите, чтобы весь запрос включал тело, заголовки… и т.д. вам не нужно запрашивать никаких запросов

 from fastapi import  Request
@app.post("/")
async def fast_service(request: Request):
    body =await request.body()

    return