• Реально ли работать на питоне не понимая сути декораторов?

    ermek6
    @ermek6
    ::Живу с удовольствием::
    Не набиваюсь в знатоки Python, просто скажу как я понял их:
    Допустим, у нас есть некоторая функция, которая отправляет файл по почте

    def send_mail(text):
        pass


    И вдруг, нам захотелось, что бы отправка логировалась как то по особому, причем функцию логирования мы хотим подключить и к другим нашим функциям, которых так много, что везде писать одно и то же не с руки (т.е. не только при отправке писем, но и при сохранении на диск непример). Для этого мы пишем функцию, куда декоратор @ автоматически подставит нашу функцию. Возвращать же наша функция тоже должна функцию.

    def my_loger(func):    # Объявляем декоратор
        def new_func(*args, **kwarts): # Объявляем функцию, которая заменит исходную
            print("Begin send")   # делаем что то важное
            func(*args, **kwargs)    # Вызываем исходную функцию
            print("End send")    # Опять делаем что то важное
        return new_func   # Возвращаем новую функцию


    Теперь, при объявлении функций мы можем перед ней написать @my_loger, и логирование будет подключено автоматически.

    т.е., написав следующее

    @my_loger
    def send_mail(test):
        pass


    фактически мы получим код

    def send_mail(text)
        print("Begin send")
        # Some actions
        print("End send")
    Ответ написан
    Комментировать
  • Как же все таки совместить front-end и back-end?

    ermek6
    @ermek6
    ::Живу с удовольствием::
    По моему скромному мнению следуют принципиально разделить проект на 2 части:
    1. Фронтенд: html + JS
    2. Бэкэнд: php

    Бэкэнд настраиваешь по урл host/api/ на который пост запросом отправляешь параметры (ключи, идентификаторы)
    Фронтэнд -- собственно index.html, который подтягивает js скрипт, работающий с API и DOM

    Такой подход позвоит менять как бэкэнд, так и фронтэнд, а так же тестировать их по отдельности.

    Цикл разработки примерно такой:
    1. Пишешь заглушку для выдачи фотки, где захарткожены выходные данные
    2. Пишешь html + js для получения данных. В процессе по необходимости меняешь данные в предыдущем пункте
    3. Пишешь реализацию бэкэнда


    и так для каждой из функций сайта
    Ответ написан
    Комментировать
  • Как найти строку которая в соседях не содержит буквы?

    ermek6
    @ermek6
    ::Живу с удовольствием::
    Как то так:
    [\s]{0}class[ =&*]

    подробнее см. тут
    Ответ написан
  • Как правильно реализовать getter/setter по ключу?

    ermek6
    @ermek6 Автор вопроса
    ::Живу с удовольствием::
    Надо использовать метод bind

    const user={
      id:1,
      name:"Юрий",
      group: 123
    }
    
    const keys= Object.keys(user).map(function (k){return k});
    
    function changeProp(obj, prop){
      obj["_"+prop] = obj[prop];
      
      function getProp() {
      	return "=="+this["_"+prop];
      }
      
      function setProp(value) {
      	this["_"+prop]=value;
      }
      
      getProp.bind(obj);
      setProp.bind(obj);
      
      delete obj[prop];
      Object.defineProperty(
      	obj, 
      	prop, 
      	{
      		get: getProp,
      		set:setProp
      		},
      	)
    }
    
    keys.map(
      function(key){
        changeProp(user, key)
      }
      )
      
    
    console.log(user.name)
    user.name='Bad Man';
    console.log(user.name)


    Output:

    ==Юрий
    ==Bad Man
    Ответ написан
  • Цикл по объектам внутри объекта. Как сделать?

    ermek6
    @ermek6
    ::Живу с удовольствием::
    imho Object.keys + typeof + рекурсия не будет зависеть от иерархии объектов и выдаст все объекты любой вложенности
    Ответ написан
    Комментировать
  • Как организовать учет в django?

    ermek6
    @ermek6 Автор вопроса
    ::Живу с удовольствием::
    В Django есть встроенный функционал, подобный которому я описал в сабже в п.2.
    Используется системой аутентификации Django.

    Суть в следующем:
    from django.db import models
    from django.contrib.contenttypes.fields import GenericForeignKey
    from django.contrib.contenttypes.models import ContentType
    from django.contrib.contenttypes.fields import GenericRelation
    
    # создадим класс, хранящий множество записей, которые могут привязываться к разным моделями
    class Accumulator(models.Model):
        # Ссылка на встроенную модель, где фигурируют все модели всех зарегистрированных приложений
        content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT, editable=False, db_index=True)
        # Ключ самого объекта, на который ссылаемся
        object_id = models.UUIDField(editable=False, db_index=True)
        # "Виртуальное" поле, в котором/через который взаимодействуем с объектом
        content_object = GenericForeignKey('content_type', 'object_id')
        # то, что собираем из всех моделей
        sum = models.DecimalField(max_digits=12, decimal_places=2, verbose_name='Сумма')
    
    class CashIn(models.Model) 
        # Вопрос религиозный. Останавливаться не буду :)
        uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
        # Что регистрирует текущая модель
        sum =  models.DecimalField(max_digits=12, decimal_places=2, verbose_name='Сумма')
        # Ссылка в объекте модели на записи
        accumulator =  GenericRelation(Accumulator)
    
        # Переопределяем встроенные методы. 
        # Вопрос можно решить и через сигналы. Еще смотрю
        def save(self, *args, **kwargs):
            super(CashIn, self).save(*args, **kwargs)
            self.accumulator.all().delete()
            self.accumulator.create(sum=self.sum)
    
        def delete(self, using=None, keep_parents=False):
            self.accumulator.all().delete()
            super(CashIn, self).delete(using=using, keep_parents=keep_parents)
    
    # Аналогичен CashIn, но записывает в другую сторону сумму
    class CashOut(models.Model)
        uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
        sum =  models.DecimalField(max_digits=12, decimal_places=2, verbose_name='Сумма')
        accumulator =  GenericRelation(Accumulator)
    
        def save(self, *args, **kwargs):
            super(CashOut, self).save(*args, **kwargs)
            self.accumulator.all().delete()
            self.accumulator.create(sum=-self.sum)
    
        def delete(self, using=None, keep_parents=False):
            self.accumulator.all().delete()
            super(CashOut, self).delete(using=using, keep_parents=keep_parents)


    После всего выше сказанного можно вытащить результат в "кассе" одной строкой, без анализа всех таблиц:
    Accumulator.objects.all().aggregate(models.Sum('sum'))['sum__sum']
    Ответ написан
    Комментировать
  • [Apache ошика AH00126. Invalid URI in request GET / HTTP/1.1] Как найти причину?

    ermek6
    @ermek6 Автор вопроса
    ::Живу с удовольствием::
    Нашел решение
    Причина была в следующем:
    Все мои файлы лежат в подкаталоге /files
    Для того, что бы не по дохли старые ссылки я в него положил вот такой вот файлик .htaccess:
    RewriteEngine on
        RewriteRule ^(.*)$ ../inc.php?sd=/$1


    Файл inc.php берет запрос и пересылает его куда нужно

    Все хорошо, все работает.
    Но, видимо по запарке скопировал этот файлик и в корень сайта.

    Удалил, все заработало!!!

    На решение натолкнуло вот это вот:
    www.experts-exchange.com/questions/22832116/Invali...

    ЦЕЛЫЙ ДЕНЬ ПОТЕРЯЛ НА ЭТИ ДВЕ СТРОЧКИ :(
    Ответ написан
    Комментировать