Задать вопрос
  • Как добавить строчку записи в конец файла /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-м порту. Ну или не париться и использовать любой другой порт.

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

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

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

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

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

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

    Если нет возможности или желания переводить ваш синтаксис шаблонов в jinja2 - тогда берите напрямую python-docx и сами пишите логику по замене токенов в шаблонах на нужные значения из БД.
    Ответ написан
    3 комментария
  • Как можно перелить бинарные данные (фотки) по сети из 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')
    Ответ написан
    1 комментарий
  • Как наиболее просто опубликовать проект Django на DigitalOcean?

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

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

    Самым простым способом может быть использование преднастроенного образа django. Правда, сам я так не делал.
    Ответ написан
    5 комментариев
  • Как к текущей дате прибавить строковую дату?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Используйте для хранения freeze_time число секунд, так будет удобнее хранить в БД и оно удобно конвертируется в/из timedelta, который уже можно прибавлять к datetime.
    Пример:
    >>> from datetime import datetime, timedelta, now
    >>> begin_date = datetime(2017, 9, 1, 0, 0, 0)
    >>> end_date = datetime(2017, 9, 30, 0, 0, 0)
    >>> freeze_time = end_date - now()
    >>> freeze_time
    datetime.timedelta(2, 17264, 411894)
    >>> freeze_time.total_seconds()
    190064.411894
    >>> freeze_time = int(freeze_time.total_seconds())
    >>> freeze_time
    190064
    >>> now() + timedelta(seconds=freeze_time)
    datetime.datetime(2017, 9, 30, 0, 1, 1, 371159)
    Ответ написан
    1 комментарий
  • Почему не происходит замены подстроки в строке?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Функция replace возвращает новую строку. Строго говоря, замена происходит, но только последнего элемента из ngreplacement.
    Но чтобы работало так, как вы и задумывали, надо чутка подправить код в районе цикла: https://ideone.com/WlNOy0
    Ответ написан
    Комментировать
  • Как передать значение QPushButton из QTableWidget в функцию?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Сам qt не знаю, но.
    self.tableWidget.setCellWidget(a1, 3, self.Btn)
    Смущает меня эта строка.
    Если я правильно её понял, вы помещаете в эту ячейку кнопку self.Btn, которая была где-то предварительно создана, перед вашим циклом. То есть, вы в N ячеек размещаете одну и ту же кнопку, вместо того, чтобы создавать кнопку для каждой строки.
    self.Btn.clicked.connect(lambda: self.DownloadProcessDef(a1))

    Тут вы, скорее всего, назначаете обработчик этой кнопке. И если в qt возможен только один обработчик события, то логично, что срабатывает последний прикреплённый.
    Ответ написан
  • Что можно дописать в запрос что бы получить результат?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Обычно в таких случаях в запрос добавляют группировку и используют агрегатные функции. Попробуйте вот так:
    SELECT SUM(bonus), nlevel(tree) - nlevel('2.383') AS level
    FROM "user" 
    INNER JOIN "bonus_item" 
    ON user_from = "user".id 
    AND user_to = 383
    WHERE (tree ~ '2.383.*{0,5}') 
    AND ("mounth" = '9:2017')
    GROUP BY (nlevel(tree) - nlevel('2.383'))
    order by nl;
    Ответ написан
    1 комментарий
  • Важно ли поддерживать зависимости в Питоне с помощью virtualenv и virtualenvwrapper?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Что вы имели ввиду под словами поддерживать зависимости?

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

    virtualenvwrapper - это инструмент для более удобной работы с python virtual environment
    Установка в систему. Это нужно сделать один раз:
    $ pip install virtualenvwrapper
    Установка домашней папки для virtualenvwrapper. Это нужно делать каждый раз, либо добавить в .bashrc / .profile файл, чтобы это выполнялось при запуске shell'а:
    $ export WORKON_HOME=~/Envs
    Выполняем virtualenvwrapper.sh, тем самым загружая в текущий shell-сеанс команды virtualenvwrapper (которые будут исполняться далее). Это нужно делать каждый раз, либо добавить в .bashrc / .profile файл, чтобы это выполнялось при запуске shell'а:
    $ source /usr/local/bin/virtualenvwrapper.sh
    Команда mkvirtualenv из virtualenvwrapper - создание виртуального окружения с именем my-venv. Это делается, собственно, только тогда, когда вы хотите создать новое виртуальное окружение:
    $ mkvirtualenv my-venv
    Команда workon из virtualenvwrapper - "активация" виртуального окружения с именем my-venv. Это нужно делать тогда, когда вы хотите "войти" в виртуальное окружение и работать в нём:
    $ workon my-venv
    Ответ написан
    5 комментариев
  • Как в intersection задать упорядочение?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Да, вам нужна структура данных, подобная множеству, но с сохранением порядка элементов.
    Возьмите OrderedSet отсюда.
    Код с использованием OrderedSet:
    from django.utils.datastructures import OrderedSet
    a = ['Мышь', 'Дом', 'Home', 'Лом', 'a', 'z']
    b = ['Мышь', 'Лом', 'z', 'jo']
    OrderedSet(a) & OrderedSet(b)

    Получится:
    OrderedSet(['Мышь', 'Лом', 'z'])
    Ответ написан
    1 комментарий
  • Почему кол-во элементов в списке равно 0?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Не strip, а str.split:
    string = 'foo.bar.test.ru'
    length = len(string.split('.'))
    print(length)

    https://ideone.com/IabPw7
    И не рекомендуется перекрывать именами своих переменных стандартные типы (это я про str)
    Ответ написан
    Комментировать
  • Как реализовать подгрузку контента по клику в Django?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Из необходимого:
    1. View основной страницы отображения новостей
    2. JS-код, который делает ajax-запрос на сервер за следующими X новостями
    3. View, который по ajax отдаёт данные (или уже готовый html) следующих X новостей
    4. JS-код, который дополняет список новостей на странице полученными X новостями
    Ответ написан
    Комментировать
  • Как модифицировать шаблон в Django, не затрагивая верстки по умолчанию?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    1) Как это исчезает? В отнаследованном шаблоне всё остаётся как и есть в шаблоне-предке.
    Т.е., если создать шаблон в проекте, и написать в нём лишь
    {% extends 'admin/base_site.html' %}
    то это будет, по сути, тот же самый шаблон.
    Приведу пример из своего проекта, по нему вы сможете сориентироваться. Можно переопределять блоки, расширяя их (добавляя то, что нужно), или даже убирая контент из них.
    Пример шаблона
    {% extends 'admin/base_site.html' %}
    
    {% load js_storage %}
    {% load admin_static %}
    {% load i18n %}
    {% load pipeline %}
    
    
    {% block extrastyle %}
        {{ block.super }}
        {% stylesheet 'Jcrop' %}
        {% stylesheet 'admin-core' %}
    {% endblock %}
    
    {% block extrahead %}
        {{ block.super }}
        {% js_storage_out %}
    {% endblock %}
    
    {# Из заголовка удалили конкретную для страницы крошку, оставив только site_title #}
    {% block title %}{{ site_title|default:_('Django site admin') }}{% endblock %}
    
    {# Добавили логотип #}
    {% block branding %}
        <img src="{% static "images/logo_50.png" %}" class="logo" />
        {{ block.super }}
    {% endblock %}
    
    {# Убрали приветствие пользователя #}
    {% block welcome-msg %}
    {% endblock %}
    
    {# Убрали ссылку View Site #}
    {% block userlinks %}
        {% if user.is_active and user.is_staff %}
            {% url 'django-admindocs-docroot' as docsroot %}
            {% if docsroot %}
                <a href="{{ docsroot }}">{% trans 'Documentation' %}</a> /
            {% endif %}
        {% endif %}
        {% if user.has_usable_password %}
        <a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a> /
        {% endif %}
        <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>
    {% endblock %}
    
    {% block footer %}
        {{ block.super }}
        {% javascript 'jquery-mousewheel' %}
        {% javascript 'js-cookie' %}
        {% javascript 'Jcrop' %}
        {% javascript 'plupload' %}
        {% javascript 'admin-core' %}
    {% endblock %}

    2) Кастомизировать шаблоны админки для конкретной модели можно, переопределяя их в папке шаблонов проекта. Например, если у меня есть приложение users, в нём есть модель user, и для неё мне нужно кастомизировать шаблон списка объектов, то я создаю файл templates/admin/users/user/change_list.html и делаю там, что мне нужно
    Пример переопределения шаблона админки для модели
    {% extends 'admin/change_list.html' %}
    
    {% block extrahead %}
        {{ block.super }}
        <script type="text/javascript">
            var url = js_storage.url_users_user_show_user_password;
            (function($) {
                $(document).ready(function($) {
                    $('#result_list td.field-rawpassword').click(function(event){
                        var $target = $(event.currentTarget);
                        var user_id = $target.closest('tr').find('td.action-checkbox input[type=checkbox]').val()
                        if(!$target.data('shown')){
                            $.get(url, {user_id: user_id}, function(data, status, xhr){
                                $target.html('<span style="font-family: Monospace">' + data.raw_password + '</span>');
                                $target.data('shown', true);
                            });
                        }
                    });
                });
            })(django.jQuery);
        </script>
    {% endblock %}

    Ответ написан
    6 комментариев