def loop(self): while True: try: # получаем id`шники записей из БД рандомно для того чтобы не # получать одни и теже записи, которые не могут быть отправлены rids = [record.id for record in Message.select().order_by(Random()).limit(10)] except PeeweeException as e: # если что-то полшло не так # пропускаем текущую итерацию log.error(e) continue # перебираем все id`шники for rid in rids: try: message = Message.get(Message.id == rid) with db.transaction(): # удаляем запись по id Message.delete().where(Message.id == rid).execute() # выполняем отправку сообщения self.smtp_conn.send(message.to, message.frm, message.body, message.topic) except (OSError, TypeError, PeeweeException, SMTPException) as e: log.error(e) continue sleep(self.sleep_time)
def action_put_json(request: Request) -> Response: """ Checks and saving data in the storage. :raises: Exception """ # todo: перенести в модель эту логику # check for POST request structure if not is_put_request_correct(request.values): log.error('Incorrect request data') return Response('Incorrect request data', status=400) # creating JSON array from JSON-string, and check JSON-data for correctness try: json_list = get_json_list_from_dict(request.values['data']) # если ошибка JSON данных except JSONDataIncorrect as e: log.error('Incorrect JSON data') return Response('Incorrect JSON data', status=400) # если ошибка в одном из адресов электронной почты except EmailAddressIncorrect: log.error('Incorrect e-mail address') return Response('Incorrect e-mail address', status=400) # start for transaction with db.transaction() as transaction: try: # creating and records for message in json_list: Message(to=message['to'], frm=message['from'], body=message['body'], topic=message['topic']).save() except Exception as e: log.error(e) # do rollback transaction.rollback() return Response('Database error, data was not recoded, sorry (:', status=500) return Response('Data was successful recorded! (%s)' % len(json_list), status=201)