Как лучше повысить читабельность кода?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: столкнулся с такой проблемой:
По вводным: сделал ендпоинт который принимает токен

@app.post('/refresh') @limiter.limit("10/minute") async def refresh(request: Request,token: str = Depends(check_refresh_token)): access_token = create_access_token({"sub": token}) pass

По вводным: и затем работает с субъектом
По вводным: сама вызываемая от Depends функция

def check_refresh_token(token: str = Depends(oauth2_scheme)): *логика функции* return payload.get("sub")

По вводным: по сути возвращает username с которым дальше и идет работа в ендпоинте.
По вводным: смущает что ендпоинт принимает токенtoken: str = Depends(check_refresh_token)По вводным: как токен но потом работает с объектом который называется token, как с usernameaccess_token = create_access_token({"sub": token})По вводным: (ведь по сути его я и вернул).
По вводным: конечно можно в ендпоинте определитьusername = tokenИ не париться
По вводным: но что вообще будет самым правильным в подобных ситуациях? Возвращать в вызываемой от Depends функции что-то общее?(например весь payload в моем случае)а затем в ендпоинте вытаскивать только username. Может подобные ситуации могут указывать на необходимость чего-либо?(как,например, в БД многие-ко-многим говорит о необходимости дополнительной таблицы)

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Никита Орлов Ответ

Повысить читабельность FastAPI/Python-кода лучше не косметикой, а разделением ответственности. Если в одном файле лежат роуты, SQL, валидация, бизнес-логика и форматирование ответа, код быстро становится нечитаемым. Разнесите проект на слои: routers, schemas, services, repositories/db, dependencies.

Пример структуры:

app/
  main.py
  routers/
    users.py
  schemas/
    users.py
  services/
    users.py
  repositories/
    users.py
  dependencies.py

app/ main.py routers/ users.py schemas/ users.py services/ users.py repositories/ users.py dependencies.py

В роутере должно быть минимум логики: принять запрос, вызвать service, вернуть response. Pydantic-схемы отвечают за вход/выход. Service содержит бизнес-правила. Repository или CRUD-слой работает с базой.

Плохо, когда endpoint выглядит как длинная процедура на 150 строк. Лучше так:

@router.post('/users', response_model=UserOut)
async def create_user(payload: UserCreate, service: UserService = Depends(get_user_service)):
    return await service.create_user(payload)

@router.post('/users', response_model=UserOut) async def create_user(payload: UserCreate, service: UserService = Depends(get_user_service)): return await service.create_user(payload)

Также помогут type hints, говорящие имена, единый формат ошибок и небольшие функции. Не превращайте код в набор абстракций ради абстракций: если функция используется один раз и занимает 5 строк, её не обязательно выносить. Но если кусок повторяется или описывает отдельное правило — вынесите.

Поставьте formatter и lint:

ruff check .
ruff format .
mypy app

ruff check . ruff format . mypy app

Итог: читабельность повышается, когда endpoint короткий, слои понятны, схемы отделены от ORM, а бизнес-правила не размазаны по роутам. Начните с одного самого большого файла: выделите schemas и services, затем повторите для остальных частей проекта.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно