Как лучше повысить читабельность кода?
Сейчас ситуация такая: столкнулся с такой проблемой:
По вводным: сделал ендпоинт который принимает токен
@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. Может подобные ситуации могут указывать на необходимость чего-либо?(как,например, в БД многие-ко-многим говорит о необходимости дополнительной таблицы)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Повысить читабельность 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.pyapp/ 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)
Также помогут type hints, говорящие имена, единый формат ошибок и небольшие функции. Не превращайте код в набор абстракций ради абстракций: если функция используется один раз и занимает 5 строк, её не обязательно выносить. Но если кусок повторяется или описывает отдельное правило — вынесите.
Поставьте formatter и lint:
ruff check . ruff format . mypy app
Итог: читабельность повышается, когда endpoint короткий, слои понятны, схемы отделены от ORM, а бизнес-правила не размазаны по роутам. Начните с одного самого большого файла: выделите schemas и services, затем повторите для остальных частей проекта.