Fastapi Очень Быстрый Crud

Всем привет, это моя первая статья на Хабре, надеюсь, она будет кому-то интересна.

На прошлом проекте я как всегда делал какой-то REST API и вдруг мне пришла мысль, что я копирую и вставляю что-то много одного и того же кода.

И я решил, почему бы не сделать это генератор этого кода это оказалось не сложно.

Сразу скажу, чем я пользуюсь.

https://github.com/tiangolo/full-stack-fastapi-postgresql и содержимое репозитория должно быть помещено в каталог backend/app/app, чтобы все работало.

Я думаю, что это также должно работать и в чистом проекте FastAPI. По умолчанию в проектах этого типа есть два типа пользователей: суперпользователь и обычный пользователь; соответственно, относительно этих двух пользователей будет создан CRUD. Для генерации CRUD достаточно просто создать модель.

  
  
  
  
   

from sqlalchemy import Column, Integer, String from app.db.base_class import Base class Category(Base): id = Column(Integer, primary_key=True, index=True) name = Column(String, nullable=False)

Назовем этот файл models/category.py. И теперь всей магии для создания всех endpoints/crud/schemas для этой модели достаточно запустить команду из каталога backend/app/app:

python3 codegen.py Category

Вам нужно не забыть установить typer и jinja2, чтобы скрипт работал.

В результате мы получим этот файл в каталоге codegen/generated.

from typing import Any, List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app import crud, models, schemas from app.api import deps from app.translate import _ router = APIRouter() @router.get("/", response_model=List[schemas.Category]) def read_categories( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, current_user: models.User = Depends(deps.get_current_active_user), ) -> Any: """ Retrieve category. """ return crud.category.get_multi(db, skip=skip, limit=limit) @router.post("/", response_model=schemas.Category) def create_category( *, db: Session = Depends(deps.get_db), category_in: schemas.CategoryCreate, current_user: models.User = Depends(deps.get_current_active_superuser), ) -> Any: """ Create new category. """ return crud.category.create(db=db, obj_in=category_in) @router.get("/{id}", response_model=schemas.Category) def read_category( id: int, current_user: models.User = Depends(deps.get_current_active_superuser), db: Session = Depends(deps.get_db), ) -> Any: """ Get a category. """ category = crud.category.get(db=db, id=id) if not category: raise HTTPException( status_code=400, detail=_("Category doesn't exists") ) return category @router.put("/{id}", response_model=schemas.Category) def update_category( *, db: Session = Depends(deps.get_db), id: int, category_in: schemas.CategoryUpdate, current_user: models.User = Depends(deps.get_current_active_superuser), ) -> Any: """ Update a category. """ category = crud.category.get(db=db, id=id) if not category: raise HTTPException( status_code=404, detail=_("Category doesn't exists"), ) category = crud.category.update(db=db, db_obj=category, obj_in=category_in) return category @router.delete("/{id}", response_model=schemas.Category) def delete_category( *, db: Session = Depends(deps.get_db), id: int, current_user: models.User = Depends(deps.get_current_active_superuser), ) -> Any: """ Delete an category. """ category = crud.category.get(db=db, id=id) if not category: raise HTTPException(status_code=404, detail=_("Category doesn't exists")) return crud.category.remove(db=db, id=id)

И в консоли получим запрос:

Install new files? [y/N]:

Прежде чем копировать файлы, вы можете просмотреть их, отредактировать и нажать «y» На самом деле, чтобы это работало, осталось проверить всего два шага: app/api/api_v1/api.py, там могут быть проблемы.

И добавьте модель в models/__init__.py, чтобы она работала.



alembic revision --autogenerated -m "new Model"

Забыл самое главное - это все ради новых участников ФастAPI Украина .

Теги: #python #fastapi #python3 #codegen #codegeneration

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.