dondublon / graduate_work Goto Github PK
View Code? Open in Web Editor NEWРепозиторий для дипломного проекта
Репозиторий для дипломного проекта
Блокирует #5.
Тут действительно не стоит писать чувствительную информацию в логи.
Здесь в админке можно добавить переводы + добавить в сборку компиляцию переводов - compilemessages
Здесь наверное случайно осталась строчка с инициализацией фастапи, не думаю что он нужен тут.
Тут можно использовать sessionmaker - https://docs.sqlalchemy.org/en/20/orm/session_basics.html#basics-of-using-a-session и далее в коде пользовали бы просто with Session() as session:...
Базовый вариант - локально
Здесь не понял зачем строка с фастапи, ведь в сервисе оно никак не используется.
gRPC. То есть ручку переделать.
переработать существующую регистрацию (в сервисе аутентифиации), чтобы писалось в профили, что надо.
Тут также не нашел код который закрывает соединение, думаю есть смысл сделать какой то get_connection() который вернет соединение а вы в коде будете использовать контекстный менеджер - https://www.psycopg.org/psycopg3/docs/basic/usage.html третья версия умеет закрывать соединение по выходе. Также думаю есть смысл использовать контекстный менеджер при работе с курсором (посмотрите вот пример есть сразу в доке).
S3 compatible, вроде.
Тут немного непонятно зачем класс.
Сейчас это осложняется тем, что генерируемые файла импортируют прямо из корня. Посмотреть, как сделано в примере у Романа.
Примерно то, что есть в UGC.
Добавить сортировки? С элементом случайности?
и "подружить" его бекенд с тем, что есть.
Использовать reviews.
Please, be careful when you work with databases, because default paginate will require to load all data in memory.
Схема С4 уровень 3.
Сейчас он принимает только login+password, надо добавить auth token.
Тут думаю можно убрать if
Тут возможно стоит подумать про закрытие соединения по окончанию работы.
Нужно в т. ч. и для интеграционных тестов.
Здесь не нашел где вызывается эта функция, определение есть, а вызова нет.
Например, если не нашли нужного юзера на get-profile.
Хорошо бы получить контекст, там есть статус, но непонятно, как.
Тут лучше убрать отладочный принт, и я бы посоветовал принять меры по обеспечению отказоустойчивости, например не допускать падения сервиса при возникновении исключений, например когда кратковременно отвалился реббит, а вы туда пишете.
Хранить ФИО, email и номер телефона.
Использовать bookmarks из UGC.
Выдача как в спринте 4, с названием, актёрами и прочими работавшими над фильмом.
Переименовать в Favorites.
Использовать лайки.
с обычной аутентификацией
Видимо, через обычный бекенд.
gRPC
Генерировать реалистчные номера - видимо, с помощью библиотеки phonenumber. C её помощью sqlalchemy проверяет номер на валидность, сейчас случайный (из теста) не проходит.
Здравствуйте ! Масштабная работа ! Есть небольшие предложения:
user_uuid = (await check_auth(request, authorize)).user_uuid
try:
result = await Bookmarks.add(user_uuid, bookmark)
logger.info("Successfully added %s, user=%s, %s=%s", COLLECTION_NAME, user_uuid, COLLECTION_NAME, bookmark)
return orjson.dumps({"success": True, "inserted_id": str(result.inserted_id)})
except Exception as e:
logger.error(
"Error adding %s, user=%s, %s=%s, error=%s", COLLECTION_NAME, user_uuid, COLLECTION_NAME, bookmark, e
)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e))
import orjson
from pydantic import BaseModel
def orjson_dumps(v, *, default):
"""Fast json dump implementation."""
return orjson.dumps(v, default=default).decode()
class Base(BaseModel):
"""Base model for representations of Elasticsearch data."""
uuid: str
class Config:
json_loads = orjson.loads
json_dumps = orjson_dumps
class FilmInfoResponse(Base):
"""Full film info response."""
title: str
description: str
imdb_rating: float
...
https://fastapi.tiangolo.com/tutorial/response-model/
16. Тут вы использовали синхронную версию, посмотрите на https://aio-pika.readthedocs.io/en/latest/index.html иначе сейчас вызовы к реббиту у вас блокирующие.
17. Тут есть шанс, что если код выше свалится - соединение не закроется. Используйте try-except-finally и закрывайте в finally.
18. Тут немножечко не понял почему paginate ? Ожидал тут увидеть нечто задействованное в пагинации )
19. Тут используйте какой нибудь асинхронный клиент вроде https://docs.aiohttp.org/en/stable/client.html или https://www.python-httpx.org/ иначе сейчас вызовы блокирующие основной цикл событий.
20. Тут и много где по коду употребляются одинарные и двойные кавычки - обычно договариваются об одном стиле. Я бы советовал прикрутить вот такую штуку - https://black.readthedocs.io/en/stable/ и прогнать файлики проекта. (а если прикрутить ее например в pre-commit - легко соблюдать единый стиль всей команды)
21. Тут проверьте, что пагинация действительно работает на этом результате. Я почему спросил - вот документация https://uriyyo-fastapi-pagination.netlify.app/tutorials/page-number-pagination/ и в примере последовательность это список моделей users: List[UserOut] и они же указаны в Page[UserOut], а у вас get_profiles по аннотации вернет непонятно пока что ), но возможно словари и лучше проверьте что это работает. На самом деле не очень эффективная штука так как насколько я понял оно отдаст страницу из всей последовательности, а всю последовательность ей необходимо держать в памяти.
Please, be careful when you work with databases, because default paginate will require to load all data in memory.
Тут значение success ведь не меняется, может так код будет нагляднее (и строк меньше) -
user_uuid = (await check_auth(request, authorize)).user_uuid
try:
result = await Bookmarks.add(user_uuid, bookmark)
logger.info("Successfully added %s, user=%s, %s=%s", COLLECTION_NAME, user_uuid, COLLECTION_NAME, bookmark)
return orjson.dumps({"success": True, "inserted_id": str(result.inserted_id)})
except Exception as e:
logger.error(
"Error adding %s, user=%s, %s=%s, error=%s", COLLECTION_NAME, user_uuid, COLLECTION_NAME, bookmark, e
)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e))
Тут я вижу попытку запускать с помощью asyncio, но есть момент - тогда нужно весь
graduate_work/profiles/src/profiles_server.py
Line 18 in 6dac4d4
class Profiles(profiles_pb2_grpc.ProfilesServicer):
разработать с учетом того что он будет использовать асинхронную модель. Фактически использовать асинхронную модель работы с БД, а для этого sqlalchemy должна использоваться соотв способом - https://docs.sqlalchemy.org/en/20/orm/extensions/asyncio.html. А в варианте том как сейчас - получается вы запускаете с помощью asyncio синхронный код (тут обычный синхронный). Тут сами посмотрите примите решение оставить просто синхронный вариант или переписать с учетом исп с asyncio.
Тут почему бы не использовать ResponseModel-и вспомните спринты по фастапи вначале там были такие штуки
import orjson
from pydantic import BaseModel
def orjson_dumps(v, *, default):
"""Fast json dump implementation."""
return orjson.dumps(v, default=default).decode()
class Base(BaseModel):
"""Base model for representations of Elasticsearch data."""
uuid: str
class Config:
json_loads = orjson.loads
json_dumps = orjson_dumps
class FilmInfoResponse(Base):
"""Full film info response."""
title: str
description: str
imdb_rating: float
...
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.