Миграция WEB-приложения Django с версии 2.7 на 3.5 (на практическом примере)

Про консоль управления виртуализацией WebVirtCloud (бывший WebVirtManager) я уже как то рассказывал, но главной его проблемой как я уже сказал является то что он пострен на базе устаревшего Python2 и автор тащит его вперед именно в таком виде. Переписывать он его отказывается мотивируя это тем что все и так работает, но на самом деле там внутри довольно много легаси-мусора. Я его умудился немного переписать под свежую редакцию Django и Python3, но дело еще далеко до завершения хотя пользоваться уже можно.

 
 
Логотип GITA-DEV

Автор: Черноусов Антон aka Gita-Dev
Опубликовано: 21 Авг 2018 (последние правки 1 месяц)

cloud django git webvirtcloud

Честно говоря не так сложно все это переписывать, чем бороться с мелкими и крупными багами которые вылезают на ровном месте и требуют глубокой отладки. Одному переписывать такое проект довольно тяжело, поэтому буду рад всем кто захочет помочь в этом нелегком деле.

В процессе работы я описал несколько типовых операций миграции с которыми вы наверняка столкнетесь если решите повторить этот эксперимент.

Ошибка - Exception Value: module 'string' has no attribute 'letters'

Меняем:

def randomPasswd(length=12, alphabet=string.letters + string.digits):
    """Generate a random password"""
    return ''.join([random.choice(alphabet) for i in xrange(length)])

на 

def randomPasswd(length=12, alphabet=string.ascii_letters + string.digits):
    """Generate a random password"""
    return ''.join([random.choice(alphabet) for i in xrange(length)])

Символ L в конце числа

В Python 2.7 L использовался для указания типа Long integer.

Python 3 will never add the L. Not when using repr(), and not when using str(). There would be no point; all integers in Python 3 are long integers.

Можно L убирать.

Ошибка в выражении raise ValueError, "only IPv4 and IPv6 supported"

Конструкция вида:

raise ValueError, "only IPv4 and IPv6 supported"

Превращается в:

raise ValueError ("only IPv4 and IPv6 supported")

Что мне кажется более логичным.

Ошибка - Exception Value: name 'unicode' is not defined

В Python 3, все строки теперь Unicode следовательно преобразования вида:

host = unicode(host)
login = unicode(login)
passwd = unicode(passwd) if passwd is not None else None

Можно свести к виду:

#host = unicode(host)
#login = unicode(login)
passwd = passwd if passwd is not None else None

Просто избавляемся от unicode(value)

Ошибка - Exception Value: module 'string' has no attribute 'lowercase'

Аналогична рассмотренной ранее и требует замены:

string.lowercase

на

string.ascii_lowercase

Ошибка - Exception Value: name 'xrange' is not defined

Дело в том, что xrange была переименована в range в Python3 и соответственно просто меняем:

xrange

на 

range

Список можно продолжать долго, но разумнее наверное просто будет опубликовать наработки относительно работоспособного проекта в GIT где вы сможете все увидеть по каммитам.

Похожие статьи

Запуск Web-приложений Django в Production-режиме (UWSGI/Nginx)

Запуск Web-приложений Django в Production-режиме (UWSGI/Nginx)

Django-приложения довольно сильно отличаются от php-приложений как структурой проекта, так и методом запуска.  Django-приложения по методу запуска больше похожи на Java, чем на PHP и классические ASP-проекты. Сегодня мы будем строить классическую связку из python-приложения и web-сервера Nginx обслуживающего реверс-проксирование запросов к приложению и предоставление файлов из каталогов media и static. LXC-изоляция в моем случае используется для поддержания python-окружения проекта и именно таким способом я предпочитаю изолировать проекты, а виртуальное окружение я предпочитаю не использовать, так как пару раз уже были проблемы при переносе Django-проектов.


Отправка оповещений Django-приложения в приватный чат Rocket.Chat

Отправка оповещений Django-приложения в приватный чат Rocket.Chat

Вчера я подумал, что если я все же вернулся к использованию Rocket.Chat и он меня уже не так бесит как предыдущие версии, то можно настроить систему оповещений о событиях на сайте и сбоях в работе Django-приложения в приватный чат Rocket.Chat. Для Python быстро нашелся вполне работоспособный модуль который идеально подошел для отправки сообщений в приватные чаты.


Создание и публикация Django-приложения (Часть первая, создание типового Django-приложения)

Создание и публикация Django-приложения (Часть первая, создание типового Django-приложения)

Для тех кто знаком с Django-разработкой в этой статье вряд ли найдется, что то интересное, но для тех кто хотел бы понять как начать писать на Django/Python небольшие приложения думаю будет интересно, и дополнительно рассмотрим простой метод автоматизированного деплоя нашего приложения на продакшн-сервер. Эту статью я решил написать для самого себя в виде небольшой шпаргалки при запуске новых проектов, поэтому если что непонятно, пишите в комментариях и я попробую рассказать более подробно.


Использование jQuery Ajax для отправки данных Django-форм без обновления WEB-страницы

Использование jQuery Ajax для отправки данных Django-форм без обновления WEB-страницы

Я последнее время довольно активно использую Java Script в своих проектах. 21-ый век все таки на дворе и надо соответствовать. Хотя почему то считается, что использовать чистый Ajax для работы с формами не стоит и необходимо предоставить возможность работы и с перезагрузкой страницы, но мне кажется, что врят ли сейчас кто-то пользуется IE6, ну и если и пользуется, это его персональное горе.


Логирование ошибок в Django-проекте на боевом сервере

Логирование ошибок в Django-проекте на боевом сервере

Как вы наверное знаете у Django Framework имеется отличная система отладки и вывода отладочной информации при ошибке WEB-приложения и включается режим отладки простым DEBUG = True. Естественно, что на продакшн (боевых) сервера такое поведение недопустимо и в случае сбоя клиенту отображается лишь страница 500 с соответствующим кодом возврата и конечно клиенту этого вполне достаточно, но нам то необходимо оперативно отреагировать на сбой web-приложения и принять меры.


Создание Sitemap.xml для Django-проектов

Создание Sitemap.xml для Django-проектов

Для чего нужен файл sitemap.xml я думаю объяснять не стоит и все кто знаком с web-разработкой понимают, что этот файл так же важен как и robots.txt. Если вы используете полноценную CMS, то там за вас всю работу уже проделали и например в Django CMS поддержка Sitemap.xml и Robots.txt есть что называется из коробки, но в чистых Django Framework-проектах все эти операции придется проделать самостоятельно.


Я прошел курс по Python 3 на Sololearn

Я прошел курс по Python 3 на Sololearn

Моя эпопея с курсами на SOLOLEARN как раз начиналась с курса по Python3. Его я проходил около месяца и стоит отметить, что курс достаточно интересный, даже с моей практикой Python/Dython-разработки курс который позиционируется как вводный принес много интересных моментов.


Отзывы и комментарии