• Переход с Django Templates на Jinja2?

    появление официальной возможности подключить jinja не значит что расширения стали бесполезны, когда потребовалось в итоге взвесив все за и против всё равно остановился на niwinz.github.io/django-jinja
    При этом я не отключал стандартные шаблоны, я использую и то и другое, где узкем местом стали шаблоны, перешел на использование jinja.

    пользуюсь примерно таким:
    TEMPLATES = [
        {
            'NAME': 'django',
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': False,
            'OPTIONS': {
                'string_if_invalid': 'VARIABLE ERROR',
                'context_processors': [
                    "django.contrib.auth.context_processors.auth",
                    "django.core.context_processors.request",
                    'django.contrib.messages.context_processors.messages',
                    'core.context_processors.cities_list',
                    'django.core.context_processors.static',
                ],
                'loaders': [
                    ('django.template.loaders.cached.Loader', [
                        'django.template.loaders.filesystem.Loader',
                        'django.template.loaders.app_directories.Loader',
                    ]),
                ],
    
            },
        },
        {
            'NAME': 'jinja2',
            'BACKEND': 'django_jinja.backend.Jinja2',
            'DIRS': [],
            'APP_DIRS': True,
            'OPTIONS': {
                'autoescape': False,  # !!!!!!
                "app_dirname": "jinja2",
                "match_extension": ".html",
                "newstyle_gettext": True,
                "translation_engine": "django.utils.translation",
                "extensions": [
                    "jinja2.ext.do",
                    "jinja2.ext.loopcontrols",
                    "jinja2.ext.with_",
                    "jinja2.ext.i18n",
                    "jinja2.ext.autoescape",
                    "django_jinja.builtins.extensions.CsrfExtension",
                    "django_jinja.builtins.extensions.CacheExtension",
                    "django_jinja.builtins.extensions.TimezoneExtension",
                    "django_jinja.builtins.extensions.UrlsExtension",
                    "django_jinja.builtins.extensions.StaticFilesExtension",
                    "django_jinja.builtins.extensions.DjangoFiltersExtension",
                    # "coffin.spaceless" не работает в py3
                ],
            }
        },
    ]
    Ответ написан
    2 комментария
  • Как правильно составить запрос?

    SELECT t.*
    FROM __test t
    LEFT JOIN __test t2 ON t.Content_id = t2.Content_id AND t2.Tag_id = 'bb'
    WHERE t.Tag_id = 'aa' AND t2.Tag_id is NULL

    если есть первичные ключи, то t.id = t2.id
    Ответ написан
    Комментировать
  • Чем можно сохранять логи и по возможности просматривать?

    https://getsentry.com/welcome/ - шикарное высокоуровневое решение, но на мой взгляд оно не предназначено для лоигорования сразу всего, чтоб потом решить что нужно, скорее логировать туда ошибки, вами самим определённые события и прочее (предоставляется и как услуга, так и на своём сервере развернуть можно)

    Для более общих случаев возможно стоит глянуть в сторону logstash.
    Ну и познакомится с такой вещью как https://ru.wikipedia.org/wiki/Syslog
    Ответ написан
    Комментировать
  • Странное поведение pycharm?

    сталкивался с подобным, и тут не столько пайчарм виноват, вопрос в том в какой кодировке выводится информация, если консоль для вывлда на текущий момент не юникодовая, тут и начинаются такие проблемы.
    гляньте что вам вернёт:
    import sys, locale, os, codecs 
    print(sys.stdout.encoding)
    print(sys.stdout.isatty())
    print(locale.getpreferredencoding())
    print(sys.getfilesystemencoding())
    Ответ написан
    Комментировать
  • Не выполняется Q() object запрос?

    О, этот просто замечательный запрос, решение для которого есть, но оно не самое явное:
    https://docs.djangoproject.com/en/1.8/topics/db/qu... (крайне рекомендую внимательно прочитать)
    У меня правда была другая ситуация я спокойно использовал последовательности фильтров, а оно приводило к непонятным выборкам.

    в вашем случае должно быть так:
    Product.objects.filter(characteristic__characteristic_type__slug='brands').filter(characteristic__characteristic_type__slug='ingridient')

    и вот в случае "обратной связи" или связях многие ко многим, эти два отдельных фильтра, не тоже самое что записать всё в одном фильтре!
    Ответ написан
  • Какую среду выбрать Matlab vs Mathematica vs Maple vs python?

    за первые 3 пункта ничего вам не скажу, по 4-му:
    bender.astro.sunysb.edu/classes/python-science
    www.astro.cornell.edu/staff/loredo/statpy
    собственно питон в этой области популярен не потому что он питон, а из-за существующих инструментов, уже на которые ложится пайтон, со всем тем за что его любят и не любят
    Ответ написан
    Комментировать
  • Почему после отправки POST - запроса через AJAX идет перенаправление на localhost:8000/?

    ещё на данный момент обратите внимание djbook.ru/rel1.8/ref/settings.html#append-slash
    Ответ написан
    Комментировать
  • Как сделать глобальный Enum в Python 2.7?

    как таковые родные перечисления появились только в 3,4, но есть бэкпорт https://pypi.python.org/pypi/enum34 вплоть до 2,4
    Но вполне возможно вам хватит и атрибутов класса?
    class A(object):
        B = 0
    print A.B  # 0
    Ответ написан
    2 комментария
  • Как создавать namedtuple с динамичным количеством полей?

    Если вы заранее знаете какие поля обязательно будут и вас интересуют только они, почему просто не создать собственный класс с этими параметрами, __init__ которого будет принимать на вход эти параметры в нужном порядке, и *args - в который попадёт всё остальное, что при желании можно сохранить или проигнорировать.
    если волнует выделение памяти используйте __slots__
    Ответ написан
    Комментировать
  • Почему не работает ckeditor?

    https://github.com/django-ckeditor/django-ckeditor...
    5 Run the collectstatic management command: $ ./manage.py collectstatic. This'll copy static CKEditor require media resources into the directory given by the STATIC_ROOT setting. See Django's documentation on managing static files for more info.

    этот пункт точно выполнили?
    Ответ написан
    2 комментария
  • Как надо и как не надо использовать менеджеры контекстов?

    Собственно очевидные варианты, работа с ресурсами - файлы. конекты к бд, они уже все готовы для работы с менеджерами контекста.

    допустим так: Как мониторить медленные и прожорливые места скрипта?

    как видится мне:
    • Использовать для гарантии выполнения каких либо действий, после определённого участка кода, даже если в нём произошли исключения, код с менеджерами в этом случае выглядит гораздо компактнее
    • Использовать как некое подобие декоратора, но не для функции, а для произвольных участков кода, их можно добавить можно убрать, функциональность обёртываемого кода при этом не меняется.
    Ответ написан
    1 комментарий
  • На что следует обратить внимание, работая с PostgreSQL, если ты ораклист?

    Про разницу между PostgreSQL и Oracle ничего не скажу, но рекомендую к прочтению: postgresql.leopard.in.ua
    Ответ написан
    Комментировать
  • Как мониторить медленные и прожорливые места скрипта?

    потребление памяти: https://pypi.python.org/pypi/memory_profiler

    Для замера времени выполнения в боевых условиях использую обычно такой менеджер контекста:
    class Profiler(object):
        def __init__(self, message_format='Elapsed time: {:.3f} sec'):
            self._message_format = message_format
    
        def __enter__(self,):
            self._startTime = time.time()
    
        def __exit__(self, rtype, value, traceback):
            print(self._message_format.format(time.time() - self._startTime))


    использовать крайне просто:
    with Profiler():
        <код время выполнения которого необходимо замерить>

    1. Код программы почти не нуждается в изменении.
    2. минимальные накладные расходы(крайне важно поскольку "нормальные" профилировщики сильно всё затормаживают, но и выдают гораздо более детальную информацию)
    3. замерит время в любом случае, если даже произойдёт исключение.
    4. аналогичную конструкцию(с минимальными изменениями для работы с logging) использую и в продакшене.
    Ответ написан
    Комментировать
  • С чего начать разработку Информационной системы?

    хех, сам пишу аналогичные вещи =)
    Начать несомненно с описания самого главного, оборудования.
    Какое оборудование вы хотите хранить?
    ---Составить список моделей, производителей
    какие параметры будут его характеризовать?
    ---Какие различные параметры каких типов.
    И тут надо принять одно из самых главных решений в области хранения параметров, как оно должно быть представлено в БД.
    Если всегда одни и теже параметры, то одна таблица с необходимыми полями, если существуют группы оборудования со своими наборами параметров, и их не много и не будут они расширятся, то отдельные таблички с описанием параметров отдельного типа оборудования. И *барабанная дробь* самый универсальный случай, когда каждая модель может иметь произвольный набор параметров, модели создаются через конструктор, тут опять несколько вариантов, или организовать EAV, или допустим хранить шаблон параметров и сами значения в json (в постгре какраз удобно), или самое сложное но и гибкое, разнесение по отдельным типам в бд разных типов параметров, с кастомным поведением для каждого. - честно говоря реализация последнего вам уже до конца года хватит ^^
    Собственно по каждому типу параметров определится с его особенностями, допустим будут ли у вас адреса, если да, просто текстом будет хранится или из некой базы подтягиваться (ФИАС прикрутить допустим), можно будет выбрать только дом или можно будет привязать оборудование к кварталу или улице, что делать если нет определённого адреса? хранить ли геокординаты?. Если нужны ip адреса, просто это ип, или необходимо указание к какой подсети он относится, связанно собственно с системой учёта ip адресов.
    Какие поля будут уникальными, какие обязательными для заполнения, какие доступными только для чтения, как сообщить пользователю об этих особенностях.

    Ну и там всякие сложности, может ли оборудование иметь топологические отношения. Нужен ли учёт портов (сетевых электрических и тд), влан, клиентов на оборудовании, взаимодействие с самим оборудованием из интерфейса системы, продолжать можно очень долго, и большинство из этого вам не нужно ^^

    Вопрос на чём вы хотите сосредоточится?
    Если хотите разобраться с Вёрсткой, не используйте готовые фреймворки, почитайте про БЭМ, попробуйте less или sass, реализуйте хоть страшный но свой интерфейс, протестируйте в разных браузерах. Потом натяните нормальный css фреймворк, попробуйте кастомизировать под себя.
    Неплохой задачкой было бы построение RESTapi для вашего сервиса, с версионностью, поддержкой метода INFO... И взяв хороший js фремворк, организовать общение страницы и сервера именно через апи.
    К гиту лучше всего привыкать сразу, и желательно поробовать работать используя такой подход habrahabr.ru/post/106912
    БД само собой делать в 3-й нормализованной форме, контролируйте сколько и каких запросов бд, разберитесь с EXPLAIN и как работают составные индексы, да и собственно различные виды индексов в постгре, и да попробуйте использовать ОРМ(с фласком видимо прямая дорого к sqlalchemy).

    з.ы. извиняюсь за сумбур =)
    Ответ написан
    3 комментария
  • Как сделать древовидную структуру в django 1.8?

    Пробовал django-mptt, но после пары дней тестов отказался, при попытке создать из 40к элементов порядка 700 деревьев, период беспроблемной вставки составлял элементов 500, потом начинали вылитать исключения, с включением отложенной перестройки дерева, период увеличился до 1500 элементов. на этом знакомство закончилось. По моим впечатлением вещь удобная, но когда данные редко меняются, и их не особо много.
    В итоге ограничился собственными костылями в виде полей root, parent, lvl, и хитрый order. чего более чем хватало для моих нужд(но это меньше чем то что предлагает django-mptt).
    Ответ написан
  • Как правильно сделать декомпозицию приложений Django?

    Вроде простой вопрос, на который тем не менее, крайне сложно дать вразумительный ответ.
    Чем больше приложений в проекте, тем лучше?

    нет, точно также не является лучшей практикой пихать всё в одно приложение.

    Разделение на модули делается для одной простой вещи - борьба со сложностью.
    Разрабатывать и поддерживать гораздо проще несколько модулей, каждый со своим функционалом и спецификой, чем один божественный апликйешен.
    Самое очевидно разбиение, эт вынесение специфического функционала, напрямую не влияющего на функционирование "ядра", допустим отчёты(если вы не саму систему отчётов пишете), они находятся в отдельном апликешене, я в принципе вообще могу их отключить, и при этом основная функциональность никак не будет затронута.
    Затем идёт явное логическое разделение, специфический функционал/задачи, допустим работа с адресным справочником, его периодическая синхронизация и прочее, все специфические задачи работы с ним находятся в отдельным модуле, и как они реализованы не касается остальной системы, при этом сам адресный справочник уже активно используется в остальной системе.
    И самый не очевидный этап, это когда один из апликешенов становится слишком сложным, тут можно воспользоваться, как разнесением функционала по отдельным файлам внутри самого апликешена, так и попытаться разнести его по отдельным апликешенам — собственно хорошо спроектированная система где это не придётся делать.
    Ответ написан
    Комментировать
  • Почему выходит AttributeError: type object 'Classics' has no attribute 'Classes'?

    совершенно спокойно, в одном случае динамически был создан данный атрибут, в другом случае никто его не создал, вот его и нет.
    Небольшой совет, лучше всего все(если есть такая возможность) используемые атрибуты класса явно задавать внутри __init__, инициализируя либо пустыми значениями, либо значениями по умолчанию.
    Ответ написан