I'm trying to receive image file for my FastAPI file, upload it to a server and then Save url in database.
My create_product
and create_category
endpoint works as expected without the file: UploadFile = File(...)
passed to the router function
I could successfully upload files with other routes and get their filename but not with the above mentioned routes
Routes:
@router.post('/category/create', response_model=schemas.CategoryOut)
def create_category(*, request: schemas.CategoryIn, file: UploadFile = File(...), db: Session = Depends(get_db), current_user: schemas.UserOut = Depends(get_current_active_user)):
category = storeview.get_category_by_slug(db, request.slug)
if category:
raise HTTPException(status.HTTP_400_BAD_REQUEST,
detail=f"Category with slug {request.slug} already exists!")
request.image = storeview.save_file(file)
return storeview.create_category(db, request)
@router.post('/product/create', response_model=schemas.Product)
async def create_product(*, file: UploadFile = File(...), request: schemas.ProductIn, category_id: int, db: Session = Depends(get_db), current_user: schemas.UserOut = Depends(get_current_active_user)):
product = storeview.get_category_by_slug(db, request.slug)
if product:
raise HTTPException(status.HTTP_400_BAD_REQUEST,
detail=f"Product with slug {request.slug} already exists!")
request.image = storeview.save_file(file)
return storeview.create_product(db, request, category_id)
Views:
def create_category(db: Session, request: schemas.CategoryIn):
new_category = models.Category(
name=request.name, slug=request.slug, image=request.image)
db.add(new_category)
db.commit()
db.refresh(new_category)
return new_category
def create_product(db: Session, request: schemas.ProductIn, category_id: int):
new_product = models.Product(**request.dict(), category_id=category_id)
db.add(new_product)
db.commit()
db.refresh(new_product)
return new_product
def save_file(file: UploadFile = File(...)):
result = cloudinary.uploader.upload(file.file)
url = result.get("url")
return url
Schemas:
class CategoryBase(BaseModel):
name: str
slug: str
image: str
class Category(CategoryBase):
id: int
class Config:
orm_mode = True
class CategoryIn(CategoryBase):
pass
class ProductBase(BaseModel):
name: str
description: Optional[str] = None
price: float
image: str
slug: str
class Product(ProductBase):
id: int
category_id: int
category: Category
class Config:
orm_mode = True
class ProductIn(ProductBase):
pass
class CategoryOut(CategoryBase):
products: List[Product] = []
id: int
class Config:
orm_mode = True