• Как правильно использовать ProcessPoolExecutor с aiohttp?

    Ranc58
    @Ranc58 Автор вопроса
    Backend python developer
    Вопрос решился советом с другого ресурса. Продублирую сюда:


    Проблема не в том, что sigint не обрабатывается, а в том, что он поднимается в каждый форк и там все взрывается, поэтому в трейсе нарисована куча KeyboardInterrupt вместо нуля.

    А если sigint в форках игнорировать, то похоже что все ништяк. По идее в кейсе с aiohttp то же самое должно прокатить.


    Необходимо указать initializer при запуске пула:

    app.process_pool = ProcessPoolExecutor(3, initializer=register_signal_handler)


    И код самой функции:

    def register_signal_handler():
        signal.signal(signal.SIGINT, lambda _, __: None)
    Ответ написан
    Комментировать
  • Как проверить наличие элемента с индексом в списке?

    Ranc58
    @Ranc58
    Backend python developer
    В вашем примере не список.
    Проверить можнно например так
    In [1]: s = [1,2,3]
    
    In [2]: 1 <= (len(s)-1)
    Out[2]: True
    
    In [3]: 3 <= (len(s)-1)
    Out[3]: False
    Ответ написан
  • Что такое инверсия зависимостей в python?

    Ranc58
    @Ranc58
    Backend python developer
    По сути - как и везде. Пример- У бизнесс логики не должно быть зависимостей от конкретных реализаций. Сегодня у вас все хранится в постгрес а завтра в монге. Инверсия зависимостей позволяет более менее безболезненно совершить такой переезд, так как слой бизнесс логики понятия не имеет где вы храните данные. Ниже накидал грубый но вроде понятный кусок кода. Есть некая сущность блог, к которой можно добавлять пользователей и смотреть их. Блог должен откуда то тянуть данные и где то хранить их. Мы создаем некий интерфейс DBInterface ,который имеет стандартные методы добавить/удалить данные. Далее создаем класс SQLdb который реализует этот интерфейс.

    В самом классе блога мы реализуем функции получения/добавления пользователей без привязки к конкретной системе хранения: просто создаем экземпляр класса SQLdb и экземпляр класса Blog , передавая туда sqldb. Когда мы захотим переехать на монгу - нам не надо будет трогать класс блога. Мы всего лишь реализуем класс Mongodb для новой базы и будем опрокидывать его в блог вместо sqldb. Итог - блог не зависит от системы хранения вообще.
    Пример сильно упрощен и утрирован, но для понимания как оно работает думаю сойдет)

    from abc import ABC, abstractmethod
    import random
    
    
    class DBInterface(ABC):
    
        @abstractmethod
        def insert(self, data):
            pass
    
        @abstractmethod
        def get(self, id):
            pass
    
    
    class SQLdb(DBInterface):
    
        def insert(self, data):
            print(f"inserted {data} from mysql")
            return random.randint(0, 100)
    
        def get(self, id):
            print(f"get user {id} data from mysql")
            return {'id': id, "data": "some_data"}
    
    
    class Mongodb(DBInterface):
    
        def insert(self, data):
            print(f"inserted {data} from mongo")
            return random.randint(0, 100)
    
        def get(self, id):
            print(f"get user {id} data from mongo")
            return {'id': id, "data": "some_data"}
    
    
    class Blog:
    
        def __init__(self, db, blog_id):
            self.db = db
            self.blog_id = blog_id
    
        def add_user(self, name):
            self.db.insert(name)
    
        def get_users(self):
            return self.db.get(self.blog_id)
    
    
    if __name__ == '__main__':
        sql_db = SQLdb()
        mongo_db = Mongodb()
    
        blog_with_sql = Blog(db=sql_db, blog_id=1)
        blog_with_sql.add_user("test") # Выведет inserted test from mysql
    
        blog_with_mongo = Blog(db=mongo_db, blog_id=1)
        blog_with_mongo.add_user("test") # Выведет inserted test from mongo
    Ответ написан
    2 комментария
  • Получение истории платежей с qiwi копилки?

    Ranc58
    @Ranc58
    Backend python developer
    с помощью вот этой библиотеки думаю возможно.
    Ну и в доке qiwi api можно поглядеть
    Ответ написан
    Комментировать
  • Как запустить файл с расширением .py?

    Ranc58
    @Ranc58
    Backend python developer
    попробуйте python2 code.py
    Ответ написан
    Комментировать
  • Как сделать регистронезависимый поиск в БД django?

    Ranc58
    @Ranc58
    Backend python developer
    Попробуйте iexact Тыц
    Ответ написан
    Комментировать
  • Какой способ разворачивания проекта на сервере самый лучший?

    Ranc58
    @Ranc58
    Backend python developer
    Заворачиваю все в докер контейнеры отдельные, и с помощью docker-compose поднимаю, на мой взгляд весьма удобно.
    Ответ написан
    Комментировать
  • Конечный автомат, в чем ошибка?

    Ranc58
    @Ranc58
    Backend python developer
    Вы не обяъвили STATE_DICT )

    В Вашем случае :
    import config
    import telebot
    
    bot = telebot.TeleBot(config.token)
    STATE_DICT = {}


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

    Ниже полный пример. Должен работать(не уверен так как писал на память, но логика верная)

    import config
    import telebot
    from telebot import types
    
    bot = telebot.TeleBot(config.token)
    STATE_DICT = {}
    
    
    @bot.message_handler(commands=['start'])
    def start(message):
        markup = types.ReplyKeyboardMarkup(
            one_time_keyboard=False,
            resize_keyboard=True
        )
        markup.add('Кнопка1')
        markup.add('Кнопка2')
        question = 'Выбери'
        chat_id = message.chat.id
        STATE_DICT[chat_id] = 'START'
        bot.send_message(chat_id, question, reply_markup=markup)
    
    
    def start_work(message):
        chat_id = message.chat.id
        markup = types.ReplyKeyboardMarkup(
            one_time_keyboard=False,
            resize_keyboard=True
        )
        if message.text == 'Кнопка1':
            STATE_DICT[chat_id] = 'VAR1'
            markup.add('Кнопка3')
            markup.add('Кнопка4')
            bot.send_message(chat_id, 'Вы выбрали ответ 1', reply_markup=markup)
        else:
            STATE_DICT[chat_id] = 'VAR2'
            markup.add('Кнопка5')
            markup.add('Кнопка6')
            bot.send_message(chat_id, 'Вы выбрали ответ 2', reply_markup=markup)
    
    
    def var1(message):
        chat_id = message.chat.id
        if message.text == 'Кнопка3':
            bot.send_message(chat_id, 'Конец с кнопкой3')
        else:
            STATE_DICT[chat_id] = 'VAR2'
            bot.send_message(chat_id, 'Конец с кнопкой2')
    
    
    def var2(message):
        chat_id = message.chat.id
        if message.text == 'Кнопка5':
            bot.send_message(chat_id, 'Конец с кнопкой5')
        else:
            STATE_DICT[chat_id] = 'VAR2'
            bot.send_message(chat_id, 'Конец с кнопкой6')
    
    
    @bot.message_handler(func=lambda message: True)
    def start_finite_machine(message):
        states = {
            'START': start_work,
            'VAR1':  var1,
            'VAR2':  var2,
        }
        chat_id = message.chat.id
        states[STATE_DICT[chat_id]](message)
    
    
    if __name__ == '__main__':
      bot.polling(none_stop=True)
    Ответ написан
    1 комментарий
  • Почему зависает бот при отправке сообщения в подменю telegram?

    Ranc58
    @Ranc58
    Backend python developer
    По поводу вопроса 2:
    Реализуйте конечный автомат и отслеживайте состояние.
    Совсем упрощенный пример:
    @bot.message_handler(func=lambda message: True)
    def start_finite_machine(message):
        if STATE_DICT[chat_id] == 'position_1':
            position_1(message)
        elif STATE_DICT[chat_id] == 'position_2':
             position_2(message)
        elif STATE_DICT[chat_id] == 'position_3':
            position_3(message)
    Ответ написан
    1 комментарий
  • Как получить user id из отправленной человеком формы?

    Ranc58
    @Ranc58
    Backend python developer
    Вам надо чтобы в модели user было поле login?
    Тогда например переопределить модель user , добавить туда поле login.
    Ответ написан
    Комментировать
  • Стоит ли покупать Playstation 3 в 2018 году?

    Ranc58
    @Ranc58
    Backend python developer
    Брать только если ради экзов, и если не избалованы современной графикой.
    По поводу ПС4 комменты сверху верны. На вторичке диски дешевле. Еще у нас в городе(думаю и у вас тоже) есть конторы, где ты можешь купить один раз б/у диск у них -> пройти игру -> притащить обратно к ним и обменять с доплатой или без на другой диск.
    Ответ написан
    Комментировать
  • Где хранить неподтвержденные данные в Django?

    Ranc58
    @Ranc58
    Backend python developer
    Погуглите django recover password - вполне возможно использовать стандартные джанговские штуки не только для восстановления, но и для смены пароля просто.
    Например: https://simpleisbetterthancomplex.com/tutorial/201...
    Ответ написан
    Комментировать
  • Друзья, что можно почитать по разработке RESTful API?

    Ranc58
    @Ranc58
    Backend python developer
    Ответ написан
    Комментировать
  • Каков план обучения бэкенду на Python?

    Ranc58
    @Ranc58
    Backend python developer
    Все зависит от наличия у вас фундаментальных знаний вообще и конкретно по веб разработке.
    Вообще судя по тому что вы написали лично я советую начать "издалека". Например почитать В. Олифер, Н. Олифер "Компьютерные сети. Принципы, технологии, протоколы" и/или Таненбаум Э., Уэзеролл Д. "Компьютерные сети". Без этих знаний будет довольно тяжко понимать что зачем и почему. А потом переходить непосредственно к питону. И не стоит забывать про всякие штуки типа базы данных и все такое.
    Ответ написан
    2 комментария
  • Бот повторно отправляет сообщение?

    Ranc58
    @Ranc58
    Backend python developer
    Была аналогичная проблема, бот на питоне. Искал в свое время решение и не смог ничего толкового найти. Добавил перед отправкой сообщения del msg и вроде перестало.
    Ответ написан
  • Telegram bot. Как реализовать параллельное выполнение задач?

    Ranc58
    @Ranc58
    Backend python developer
    Реализовывал подобное таким способом:
    В базе хранятся нужные значения, раз в минуту(например) в celery запускается таск, который ищет в БД ID людей, которым бот должен выслать некое уведомление. Если таковые имеются - то по API передается боту список этих ID, и бот устраивает рассылку.
    Сам бот реализован был по такой схеме:
    https://github.com/eternnoir/pyTelegramBotAPI/blob...
    Просто добавил еще одну ручку, которая принимает POST запрос со списком ID пользователей.
    Ответ написан
    Комментировать
  • Как заимпортировать модуль Python, если он лежит не в одной и тойже папке со скриптом?

    Ranc58
    @Ranc58
    Backend python developer
    import sys
    sys.path.append('..')
    
    import module


    Есть такой вариант.
    Ответ написан
    Комментировать
  • Платный сервер для Telegram Bot?

    Ranc58
    @Ranc58
    Backend python developer
    Пользовался для бота simplecloud. Покупать ssl как выше советовали незнаю зачем. Тупо создаёте сертификат и все такое на ПК, и готово.

    Вот здесь например указано в коде про создание сертификата.
    https://github.com/eternnoir/pyTelegramBotAPI/blob...
    Ответ написан
    Комментировать
  • Как вызвать функцию из task в celery?

    Ranc58
    @Ranc58
    Backend python developer
    from .stats.views import sorting_task_response - так тоже выбивает ошибку?
    Ответ написан