All streams
Search
Write a publication
Pull to refresh
95
22
Алексей Яковенко @yakvenalex

Опытный python разработчик с многолетним стажем.

Send message

Вы лично можете показать хороший пример написанного кода с качественным объяснением или, как и большинство подобных комментаторов, ограничетесь токсичным комментарием и уйдете с чувством выполненного долга?

Всего 1 пример. Или, давайте проще, на примере проекта, который я написал и рассматривал - покажиите как реализовать проще, а затем объясните понятным для новичков языком.

Подозреваю, что на этом вы остановитесь.

Где-то в углу заплакал Django разработчик))

Если бы вы внимательно читали эту статью, то заметили бы, что я сразу указал две важные вещи. Во-первых, это учебный проект. А во-вторых, в следующей статье я планирую реализовать фронт-энд на VueJS, а бэкенд — на aiogram и FastApi (об этом тоже говорил в статье).

Вы, действительно, уверены, что вебсокеты FastApi не используются в боевых проектах?

В текущей реализации нет, но это все можно сделать.

Вы верно отметили достоинства Centrifugo. Эта технология действительно интересная и значительно упрощает работу с веб-сокетами.

Выбор FastApi в качестве платформы для реализации данной задачи вполне очевиден. Статья посвящена именно этой теме, и я хотел продемонстрировать на простом примере, как это можно сделать с помощью FastApi. К тому же, я бы не сказал, что это очень сложно.

За стронги согласен. Пережал - все убрал) Думаю, что очевидно, что этот материал расчиитан на новичков?

Этой теме статья посвящена. Вопрос, по меньшей мере, странный.

Спасибо за обратную связь. За уровни изоляции принято - буду исправляться)

Браузеры понимают только 1 язык программирования - JavaScript, После разработки на VueJs происходит сборка проекта (в статье это указано). Ну а сам собранный проект уже написан на JS + HTML + CSS

В бэкенде нужно создать специальный метод. Затем следует подключить к боту кнопку «Отменить запись», при нажатии на которую будет запускаться этот метод. Внутри метода нужно удалить запись и задачи APScheduler, ответственные за уведомления.

Принято, спасибо за конструктивную критику)

Такой подход позволяет удобно обращаться к методам, используя дочерние классы. Смысл в этом. Создаем дочерний класс - дальше достаточно вызывать методы в таком формате:

await UsesDao.find_all(session=session)
await ProductsDao.find_all(session=session)

как по мне - это удобно)

Добрый день!

В данном проекте я придерживался подхода, который может быть не очевиден на первый взгляд, поэтому поясню.

Основная идея заключается в том, что проект на FastAPI делится на микросервисы. В этом конкретном проекте их два: API и Telegram-бот. Каждый микросервис имеет свою структуру, включающую файлы router.py, dao.py и schemas.py. Эти файлы размещаются внутри соответствующего микросервиса, и в них описывается вся логика, связанная с его функциональностью.

Такой подход удобен, так как позволяет изолировать ответственность каждого микросервиса. Это помогает лучше управлять кодом, упростить рефакторинг и масштабирование. Если вы знакомы с Django, то, возможно, заметите сходство: в Django также используется структура, которая логически разделяет компоненты приложения.

Этот способ организации может быть не единственным верным, но он делает проект понятным, поддерживаемым и легко расширяемым.

Здравствуйте!

Существует множество стратегий, как реализовать функцию корзины покупок. Одна из самых простых — фиксировать товары, добавленные пользователем, в базе данных. Для этого можно использовать как Redis, так и табличные базы данных, такие как SQLite или PostgreSQL.

Когда пользователь нажимает на кнопку «добавить в корзину», за ним закрепляется уникальный идентификатор товара. Затем, при переходе в раздел корзины, можно выставить общий счет.

Хамство и переходы на личности — это слабая позиция, особенно если за ней не стоит ничего, кроме громких слов. У вас есть конкретные претензии к коду? Тогда давайте разберем их детально.

  1. "Код на уровне студента" — прекрасно, но покажите, как написать лучше. Ни одной статьи, ни одного примера вашего кода на горизонте, только обвинения, минусовой рейтинг и 200+ пустых отзывов.

  2. "Приводит к проблемам" — каких именно? Опишите четко и обоснованно, с примерами. Иначе это просто слова ради слов.

  3. "Блокировка Telegram" — завязка на Telegram для данного проекта была обоснована. Если у вас есть конкретные предложения по архитектуре, где Telegram можно заменить, давайте обсудим. И не забывайте, что всегда можно добавить поддержку альтернативных платформ.

На текущий момент ваш вклад сводится к попыткам унизить чужую работу без предложений. Попробуйте внести реальный вклад в развитие диалога, а не просто демонстрируйте своё неудовольствие.

И теперь, вы ж у нас "Middle python developer". Кроме хамства и перехода на личности продемонстрируйте свой профессионализм в коде, а не пустым гонором тут. Я вам задал конкретный вопрос. Ответьте.

Вот код от вчерашнего студента, который вчера вечером почитал документацию Aiogram и услышал, что веб-хуки круто, а после криво их реализовал:

async def robokassa_result(request: web.Request) -> web.Response:
    """
    Обрабатывает запрос от Робокассы на ResultURL.

    :param request: HTTP-запрос
    :return: Текстовый ответ с результатами проверки
    """
    logger.success("Получен ответ от Робокассы!")
    data = await request.post()

    # Извлекаем параметры из запроса
    signature = data.get('SignatureValue')
    out_sum = data.get('OutSum')
    inv_id = data.get('InvId')
    user_id = data.get('Shp_user_id')
    user_telegram_id = data.get('Shp_user_telegram_id')
    product_id = data.get('Shp_product_id')

    # Проверяем подпись
    if check_signature_result(
        out_sum=out_sum,
        inv_id=inv_id,
        received_signature=signature,
        password=settings.MRH_PASS_2,
        user_id=user_id,
        user_telegram_id=user_telegram_id,
        product_id=product_id
    ):
        result = f"OK{inv_id}"
        logger.info(f"Успешная проверка подписи для InvId: {inv_id}")

        payment_data = {
            'user_id': int(user_id),
            'payment_id': signature,
            'price': int(out_sum),
            'product_id': int(product_id),
            'payment_type': "robocassa"
        }
        async with async_session_maker() as session:
            await successful_payment_logic(
                session=session,
                payment_data=payment_data,
                currency="₽",
                user_tg_id=int(user_telegram_id),
                bot=bot
            )
            await session.commit()
    else:
        result = "bad sign"
        logger.warning(f"Неверная подпись для InvId: {inv_id}")

    logger.info(f"Ответ: {result}")
    return web.Response(text=result)

Подскажите альтернативу этому подходу без хуков на методе поллинга. Опрашивать будем раз в 5 секунд платежку, да?

Вы оплату через Робокассу тоже предлагаете делать через поллинг? Или вы говорите о том, что лучше делать отдельное приложение для хуков под платежки? То есть, по вашему, это лучше чем в текущей реализации?

Что касается хука в контексте ботов. Как минимум, на данный момент есть прирост в скорости обработки + удобная интеграция бота в хук платежки.

Ну и повторю вопросы:

  1. Кроме одной строчки кода, что бы вы, как "Не вчерашний студент" в коде бы заменили

  2. Как бы вы, как "не вчерашний студент" реализовали связку хука, который ловит ответ от Робокассы и через бота пробрасывает ответ?

Вы, как опытный кодер и "не вчерашний студент" подскажите. Какие бы лично вы тут правки внесли, кроме замены 1 строки кода?

Information

Rating
332-nd
Location
Краснодар, Краснодарский край, Россия
Date of birth
Registered
Activity

Specialization

Specialist
From 200,000 ₽
SQL
Python
PostgreSQL