IT Блог

Документации и переводы

Статьи на технические темы

Послать сообщение об ошибке на почту из django management commands

По умолчанию вы не сможете получать сообщение об ошибках, если management-команда выполняется через cron. Но это легко исправить: достаточно добавить в settings.py дополнительный logger:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        # other loggers
        'management_commands': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        }
    }
}

А в manage.py обернуть команду execute_from_command_line(sys.argv) исключением Exception, например так:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

    from django.core.management import execute_from_command_line
    from logging import getLogger
    import traceback

    logger = getLogger('management_commands')

    try:
        execute_from_command_line(sys.argv)
    except Exception as...

django-select2 в Django

Сходу использовать django_select2 в админке Django не получается из-за того, что django_select2 требует JQuery. Виджет django_select2 по умолчанию не подключает JQuery. Более подробно об этом вы можете прочитать на странице .

Чтобы быстро подключить jQuery к django_select2, сделайте следующее:


Ключ (extended_object_id) уже существует

При публикации страницы в django-cms (3.5.0) может возникнуть ошибка:

Exception Type: IntegrityError at /admin/cms/page/312/ru/publish/
Exception Value: ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "spec_pageext_extended_object_id_key"
DETAIL: Ключ "(extended_object_id)=(324)" уже существует.

По-английски:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "spec_pageext_extended_object_id_key"
DETAIL:  Key (extended_object_id)=(324) already exists.

Из трейсбека понятно, что ошибка связана с Extension (Расширение страницы).

Ещё нужно сказать, что ошибка не всегда проявляется при публикации страницы. Чтобы воспроизвести ошибку нужно:

  1. Создать расширение (или по-другому "Сохранить" из Меню / Страница / Моё расширение)
  2. Опубликовать страницу
  3. Перейти на черновую версию, щёлкнув "Изменить"
  4. Удалить расширение...

'NoneType' object has no attribute 'get_all_fields' parler

Если при создании своей миграции для добавления полей, которые должны быть переводимы, возникает ошибка:

'NoneType' object has no attribute 'get_all_fields'

1 вариант. Обновить parler до новой версии

В новых версиях parler эта ошибка устранена, поэтому достаточно обновить пакет. 

2 вариант. Добавить TranslatableModelMixin в базовые классы модели

Просто добавьте MyModel.__bases__ = (models.Model, TranslatableModelMixin) после объявления MyModel.

Для наглядности возьмём  и добавим необходимую строчку:

from django.db import migrations
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist


def forwards_func(apps, schema_editor):
    MyModel = apps.get_model('myapp', 'MyModel')
    MyModel.__bases__ = (models.Model, TranslatableModelMixin)
    MyModelTranslation = apps.get_model('myapp', 'MyModelTranslation')

    for object...

Не работает hg pull

Если у вас перестал работать hg pull и выдаётся ошибка:

abort: error: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:581)

Или даже такая:

То попробуйте обновить mercurial до версии 3.3 и выше:

pip install mercurial==3.3

Причина ошибки

Ошибка abort: error: [SSL: WRONG_VERSION_NUMBER] wrong version number стала появляться у пользователей bitbucket, которые используют mercurial старых версии с протоколом TLSv1 и TLSv1.1. Теперь BitBucket поддерживает протоколы TLSv1.2. Подробнее на странице .

Это значит, что нужно обновить mercurial до версии 3.3 и выше. Обнаружил версию экспериментально, так как в истории изменений  не нашёл упоминания об TLS.  


wget 403: Forbidden

Если при скачивании сайта командой wget, например с такими параметрами:

wget -r -k -l 7 -p -E -nc http://site.ru/

у вас возникла ошибка 403 Forbidden:

HTTP-запрос отправлен. Ожидание ответа... 403 Forbidden
2018-11-10 13:25:41 ОШИБКА 403: Forbidden.

Попробуйте добавить заголовки к команде:

wget -r -k -l 7 -p -E -nc --header="User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11" --header="Referer: http://xmodulo.com/" http://site.ru/

Кто-то использует ещё заголовок --header="Accept-Encoding: compress, gzip", но у меня с ним не заработало.

Если...


Добавить jquery в widget Django

Есть два простых способа добавить jQuery в формы или виджеты в админку django

1. Добавление другой версии jQuery

Сначала нужно . В качестве примера для этой статьи я использовал . Помещаем её, например, сюда: my_project/static/jquery/jquery-2.2.0.min.js.


TypeError: (intermediate value)

Неожиданным образом может вылезти ошибка javascript:

TypeError: (intermediate value)

Как оказалось одна из причин - просто не поставлена точка с запятой после объявления переменной, например:

form_uploader_ru:
var form_uploader_lang = {
    sending: 'Отправка...',
    file_sending: 'Отправка файла...',
    send: 'Отправить'
}; <--- Обязательно нужно поставить знак ";"

Попробуйте проверить, все ли ваши переменные закрываются точкой с запятой (";").

Как эта ошибка возникла в моём коде?

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

Меня сбило то, что локально всё замечательно работало, а на сервере возникала ошибка. Потом уже путём поочерёдного исключения, подключаемых скриптов...


Воспроизвести ошибку в браузере, полученную на почте от Django

Как правило, если возникает 500 ошибка вашего приложения на сервере, то посылается сгенерированный Django-отчёт об ошибке (трейсбек) электронным адресам, указанным в ADMINS в settings.py. Это может выглядеть примерно так:

Internal Server Error: /billing/online_reg_ip/

KeyError at /billing/online_reg_ip/
'birthday_day'

Request Method: POST
Request URL: https://site.ru/billing/online_reg_ip/
Django Version: 1.10.7
Python Executable: /usr/bin/uwsgi-core
Python Version: 2.7.9
Python Path: ['/path_to_project/src/', '.', '', ...]
Server time: Ср, 21 Мар 2018 08:40:50 +0800
Installed Applications: (u'django.contrib.contenttypes', ...)
Installed Middleware: (u'django.middleware.cache.UpdateCacheMiddleware', ...)

Traceback: 
File "/path_to_projet/env/local/lib/python2.7...

AttributeError: Module Pip has no attribute 'main' 10.X

Начиная с pip версии 10.X, появляется ошибка при вызове функции pip.main():

AttributeError: Module Pip has no attribute 'main'

Функция main() переехала в модуль _internal (pip._internal), поэтому можно откатить pip до версии 9.X, например так:

pip install --upgrade pip==9.0.3

Или импортировать main() из _internal:

from pip._internal import main

Если у вас на разных машинах (напр, на локальной и боевой, как было в моём случае) стоит pip разных версий, то можно воспользоваться отлавливанием исключения ImportError:

try:
    from pip._internal import main
except ImportError:
    from pip import main

PROJECT_ROOT = abspath(dirname(__file__))
main(['install', '-r...

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте