• В чём отличие @Decorator от @Decorator()?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Декоратор - это функция, которой на вход подаётся функция и вернуть он должен тоже функцию. Например:
    @decorator 
    def foo():
     ..

    Эквивалентно foo = decorator(foo)

    Теперь про случай из вопроса. В качестве декоратора вместо обычной функции вы используете класс (точнее его объект):
    @FuncDec()
    def foo():
        print('Hello')

    Эквивалентно foo = FuncDec()(foo), а именно:
    • создаётся объект FuncDec (вызывается конструктор __init__)
    • этот объект вызывается (__call__) вместе с параметром foo
    • объект вернул функцию wrapper, которая и будет в дальнейшем выполняться вместо объявленной foo
    • профит

    Но если убрать скобки, то получится эквивалент foo = FuncDec(foo)
    То есть просто вызов конструктора, который у вас не принимает параметров - поэтому и ругается.
    Ответ написан
  • Как решить ошибку Identation error?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Это все из-за кнопки "Хакнуть Пентагон" (Да, я успел увидеть, потом вы отредактировали текст вопроса).

    Видите ли, в питоне встроена защита от причинения любого ущерба национальной безопасности США. Если интерпретатор при анализе текста программы видит, что вы собираетесь сделать что-то непоправимое, он выбрасывает ошибку и отказывается выполнять такую программу. Спецы говорят, обойти эту защиту вряд ли получится.
    Ответ написан
  • Реально ли зашифровать папку в Windows через python?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Очень интересно видеть вопрос,
    решающийся
        обычным
      гуглением,
    в фильтре сложных вопросов, ага.
    Ответ написан
  • Как вывести пост, если пользователь отправивший запрос его владелец и 403 в противном случае django rest framework?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    После просмотра вашего кода смутило, что вы из django_user пытаетесь ещё обратиться к user. Так что чисто навскидку может помочь:
    if not obj.user == django_user:
        return Response(status=HTTP_403_FORBIDDEN)

    Но вообще в DRF есть permissions, и вот как раз второй пример из документации о владельце запрашиваемого объекта

    UPD: ой ёй, только щас увидел, какое у вас странное условие, вот так как-то правильнее будет
    if obj.user != django_user:
            return Response(status=HTTP_403_FORBIDDEN)
    Ответ написан
  • Как в Django сделать механизм, при котором через объединённые формы можно изменять значений у нескольких записей сразу?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Если подходит вариант реализовать это в обычной админке Django, то решением может быть ModelAdmin.list_editable. Этот атрибут в джанге есть давно. И когда-то я его даже использовал.

    Есть 1 подводный камень, по крайней мере года 3 назад он точно был: если в админке одной и той же модели изменяли данные более 1 человека, то данные могли непредсказуемо потеряться и/или измениться.

    Поковыряв тогда исходники, я выяснил, что это происходит из-за того, что при сохранении отредактированных данных джанга опирается на относительное положение объекта (!) в кверисете (!!) в текущий момент!!!
    Т.е., популярно выражаясь: не "сохрани значение Super Item в поле title инстанса id=345 модели MyModel", а "сохрани значение Super Item в поле title инстанса, который в текущем кверисете MyModel.objects.filter(category="Items") на странице №2 находится на 14-й позиции".

    Причём сначала может показаться логичным, мол, классический кейс - одни и те же данные изменяют 2 и более человека, конечно можно получить перезаписывание, но если бы! Даже просто добавив новый объект этой модели, причём даже не из админки, можно запросто нарушить вот эту вот относительную "адресацию".
    Ответ написан
  • Python GIF to APNG как?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    возможн ли как то напрямую через сам PIL сконвертировать gif в apng?

    Что значит "напрямую"? Что вы в данном контексте вкладываете в это слово?
    Вы форматы GIF и APNG знаете? Я лично нет, но по ощущениям работы с инструментами по созданию анимированных гифок в лихих нулевых - в GIF-файле банально куча картинок-кадров + задан промежуток смены "кадров". Никаких, боже упаси, "потоков" и кей-фреймов, как в нормальных видеоформатах.

    Чем не понравилась либа apng? Я посмотрел - она похожа на живую, а pillow указана как опциональная зависимость (без неё возможна работа только с PNG).

    Однако сам то pil вполне себе умеет вынимать кадры... в общем кривые костыли

    Да никаких костылей. Если вы знаете, как извлечь все кадры из гифки, то у вас задача уже решена, по факту. Написать надо строк 10-15 кода, и всего делов.

    Любой конвертер из одного формата в другой будет оперировать кадрами, никаких тут "напрямую" и вообще ничего зазорного - нет.
    Ответ написан
  • Почему код не работает(простенький калькулятор)?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    while True:
      abc=input("+ или - ?\n")
      if abc in ["+", '-']:
        break
      else:
        continue
    Ответ написан
  • Не могу понять, почему python выкидывает исключение?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Вы результат преобразования никуда не сохраняете.
    Вот так работает без ошибок:
    a = input()
    b = input()
    l = input()
    N = input()
    
    a = int(a)
    b = int(b)
    l = int(l)
    N = int(N)
    
    lenl = 2 * l
    lena = (2 * N - 1) * a
    lenb = 2*b *(N - 1)
    sumlab = lenl + lena + lenb
    print(sumlab)


    или можно преобразовать сразу там же, где происходит ввод:
    a = int(input())
    b = int(input())
    l = int(input())
    N = int(input())
    
    lenl = 2 * l
    lena = (2 * N - 1) * a
    lenb = 2*b *(N - 1)
    sumlab = lenl + lena + lenb
    print(sumlab)
    Ответ написан
  • Как добавить строчку записи в конец файла /etc/hosts в докерфайле?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Цель задачи: необходимо, чтобы вместо "127.0.0.1:8080" можно набить в адресной строке http://test, те http://127.0.0.1:8080=http://test

    Чтобы решить эту задачу, вам надо сделать 2 вещи:
    1) руками в hosts-файл на вашей хост-машине добавить строчку 127.0.0.1 test. Так вы решите вопрос с именем хоста (test вместо IP 127.0.0.1)
    2) при старте контейнера с веб-сервером биндить порт веб-сервера из контейнера с 80-м портом вашей хост-машины (с помощью параметра --publish): что-то типа docker run --publish 80:8080 ... - здесь как бы написано: "связать внутренний порт контейнера 8080 с внешним портом хост-машины 80" (в вашем случае вроде как оба порта будут 80, и внутренний, и внешний).
    Если внешний порт, с помощью которого вы хотите смотреть веб-сайт, отличается от дефолтного (80 для HTTP и/или 443 для HTTPS) - никакими прописываниями ни в каких магических файлах не получится избавиться от указания порта при набирании адреса в адресной строке браузера.
    И ещё - если у вас на хост-машине есть что-то, что уже слушает 80-й порт - ну мало ли, может nginx какой запущен или тот же апач - то связать порты не выйдет, нужно сначала остановить тот сервис, что сидит на 80-м порту. Ну или не париться и использовать любой другой порт.

    В плане именно манипуляций с докером: кроме бинда внутреннего порта контейнера на "внешний" вашей хост-машины ничего больше не нужно делать. Контейнер вам в файл хост-машины строчку не пропишет. Не, технически это возможно сделать, но не нужно совершенно точно.

    И скажите: откуда вообще изначально взялась такая потребность? Если чисто сделать красивый адрес для использования локально в процессе разработки - ну ок, хотя можно и без этого. Если вы делаете это уже для продакшна - то всё, что вы описали в вопросе - не то, не так и не в ту сторону.
    Ответ написан
  • Как использовать собственные стили каждого приложения в шаблоне Django?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    и есть html файл который определяет по ссылке какое приложение сейчас используется.

    Не надо так.
    В Django есть возможность в каждом приложении создавать свои шаблоны и static файлы - css, js и т.п. Шаблоны могут наследоваться друг от друга - это ключевой момент для логичной их организации даже для небольшого проекта, не говоря уже про большие.
    Можете создать один общий родительский шаблон-лэйаут на весь проект, в нём подключить общую для проекта статику (всякие там jquery и прочие либы).
    В каждом приложении в свою очередь создаётся свой лэйаут или шаблон, отнаследованный от общего, и в нём уже дополнительно подключаются конкретные css/js конкретного приложения.
    Погуглите про наследование шаблонов, про блоки в них и про то, как переопределять эти блоки в отнаследованных шаблонах.
    Ответ написан
  • Как можно readlin()-ом построчно читать текстовый файл, игнорирую управляющую последовательность \x?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Ваш случай - смешанный тип файла, текстово-бинарный. Его надо читать как бинарный, обрабатывать данные можно тоже в бинарном режиме. Если нужно, на завершающих этапах обработки можно необходимые данные попытаться преобразовать в текст (в блоке try-catch).
    import re
    
    reg = re.compile(rb'([0-9]*)\>([0-9]{4}\-[0-9]{2}\-[0-9]{2}\ [0-9]{2}\:[0-9]{2}\:[0-9]{2}\ \+[0-9]{4})\ (.*)')
    with open('1933.log', 'rb') as f:
        for s in f:
            s = s.strip(b'\r\n')
            l = re.split(reg, s)
            chunks = [e for e in l if e]  # не силён в регулярках, в массиве почему-то оказываются пустые строки
            if len(chunks) != 3:
                continue
            code, datetime, payload = chunks
            print(code, datetime, payload)
    Ответ написан
  • Как в python превратить число секунд в дату и время?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    import datetime
    
    MY_UTC_EPOCH_START = 1262304000  # 00:00:00 01.01.2010 UTC
    
    def my_utcfromtimestamp(ts):
        return datetime.datetime.utcfromtimestamp(ts + MY_UTC_EPOCH_START)

    Функция работает полностью аналогично стандартной datetime.datetime.utcfromtimestamp, только лишь применяя поправку на начало вашей "UTC эпохи" (полночь 1 января 2010 по Гринвичу):
    >>> my_utcfromtimestamp(1)
    datetime.datetime(2010, 1, 1, 0, 0, 1)
    >>> my_utcfromtimestamp(123)
    datetime.datetime(2010, 1, 1, 0, 2, 3)
    >>> my_utcfromtimestamp(3600)
    datetime.datetime(2010, 1, 1, 1, 0)
    Ответ написан
  • Как настроить uwsgi для работы с Django и pipenv?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    [uwsgi]
    project = cv-base
    ...
    chdir = %(base)/%(project)/ems
    ...
    module = %(project).wsgi:application

    Итого у вас получается, что module превращается в cv-base.wsgi:application, но в вашем дереве проекта внутри chdir нет cv-base. Вероятно, значение module должно быть ems.wsgi:application
    Ответ написан
  • Какой стиль программирования выбрать, чтобы не вникать спустя время в проект?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Тут как раз речь о том, что применимо для всех языков, а не только для PHP.
    Если будете применять устоявшиеся практики и паттерны; не изобретать велосипеды, а искать и интегрировать имеющиеся решения; а также уместно комментировать код и вести документацию - через год поблагодарите себя, даже если не придётся возвращаться к написанному и править, потому что вырастите в целом как востребованный специалист.
    Ответ написан
  • Симуляция нажатия кнопки на сайте?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Зависит целиком от сайта и от того, насколько его разработчики хотели защититься от подобных "симулянтов".
    Но в общем случае (и независимо от языка программирования) процесс такой:
    - включить средства разработчика в браузере
    - заполнить форму вручную, отправить, дождаться результата
    - изучить выполненные сетевые запросы
    - написать скрипт, который будет выполнять эти запросы, со всеми заголовками.
    Если в запросах фигурирует что-то вроде xsrf-token - предварительно сэмулировать загрузку страницы и/или той её части, где приходит этот xsrf-token, чтобы уже с ним выполнять ajax-запросы с заполненной формой.
    Ответ написан
  • Как вывести данные из django в шаблон word?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Так гугл же!
    Первое, что гуглится по запросу python docx template - библиотека docxtpl
    Под капотом используется известная в этих кругах либа python-docx для возни с документами + также популярная jinja2 для, собственно, шаблонизации.

    И да - про именно .doc, старый добрый бинарный проприетарный формат, скорее всего, придётся забыть. Только .docx.

    в нём есть некоторый шаблон, подставляются значения из самой базы

    Если нет возможности или желания переводить ваш синтаксис шаблонов в jinja2 - тогда берите напрямую python-docx и сами пишите логику по замене токенов в шаблонах на нужные значения из БД.
    Ответ написан
  • Как можно перелить бинарные данные (фотки) по сети из MSSQL в MySQL 5.7?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Не работал c MSSQL, но судя по обычной документации, тип IMAGE в MSSQL - обычный blob. Двоичные данные размером до 2Гб. То есть, MSSQL IMAGE и MySQL BLOB должны быть совместимы.
    В phpMyAdmin даже помню была возможность выбора при импорте данных, в формате какой именно СУБД представлен файл, который нужно загрузить в БД.
    Так что, вполне возможно стандартными методами экспортировать данные из MSSQL и импортировать в MySQL. И не придётся задумываться о таких вещах как base64.
    Ответ написан
  • Как правильно сохранить картинку из url в django models.ImageField?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Сохранение картинки работает, а вот формирование пути сделано с ошибкой
    def save_model(self, request, obj, form, change):
        r = requests.get(url, stream=True)
        r.raw.decode_content = True
        obj.image.save(os.path.join('img', '{}.jpg'.format(slugify(unidecode(obj.title)))), r.raw)
        obj.save()

    os.path.join формирует путь из директорий и имени файла, но имя отдельно взятой папки или файла им формировать не нужно.
    Ответ написан
  • Есть модули для изображений по мимо "pillow"?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    from PIL import Image, ImageGrab, ImageFont, ImageDraw
    tatras = Image.open("screen.png")
    rotated = tatras.rotate(-30, resample=Image.BICUBIC, expand=True)
    rotated.save('tatras_rotated.jpg', quality=90)

    Поиграйтесь с параметрами rotate (не все фильтры могут быть использованы для операции поворота изображения, BICUBIC вроде самый лучший) и параметрами save для оптимального "размер-качество".
    Возможно, если перейдёте на работу с PNG вместо JPEG, будет вообще шоколадно, но это вам надо потестировать.

    Сохраняйте в png, в общем, там артефактов я не обнаружил:
    rotated.save('tatras_rotated.png')
    Ответ написан
  • Как наиболее просто опубликовать проект Django на DigitalOcean?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    У digitalocean есть хорошие рабочие step-by-step мануалы, как развернуть то или иное. Не исключение и django:

    Как наиболее просто

    Самым простым способом может быть использование преднастроенного образа django. Правда, сам я так не делал.
    Ответ написан