...

воскресенье, 22 июля 2018 г.

Обновление Django с версии 1.9 до версии 2.0

Здравствуйте, сегодня я хотел бы вам рассказать о том, как обновить проект с версии 1.9 до 2.0. Какие основные нюансы нужно учесть и переписать, дабы проект стартовал на новой версии Django.

Первый шаг.


Это обновление Django до версии 2.0, а также обновление всех сопутствующих ваших пакетов, которые используются в проекте, т.к. я использую виртуальное окружение и requirements.txt, то для меня это один способ, для вас может быть другой.
После того как вы обновили все пакеты, не стоит запускать проект, он всё равно не запустится, поэтому сразу приступим к исправлению всех основных моментов, дабы проект стартанул.

Второй шаг. Обновление всех urls.py вашего проекта.


В главном вашем urls.py, в котором вы инклюдите урлы из других апликейшинов, подключаем:
from django.urls import re_path, path
И меняем c url на path, а так же убираем регулярные выражения в данных подключениях.
url(r'^ some/', include('some.urls')), # старый вариант
path('some/', include('some.urls')),

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

re_path(r'^app/$', App.as_view(), name='app')

В подключаемых апликейшинах(например some/urls.py), в файле urls.py, используем:
re_path(r'^create/$', Create.as_view(), name='create')

Если вы используете namespace в урлах при инклуде, то удаляем их оттуда и переносим их непосредственно в подключаемое приложение. Переходим в urls.py данного приложения и прописываем сверху над urlpatterns =[]
app_name = ‘app-application’

Данная строчка выступает заменой namespace и призвана сделать главный urls.py более чистым и читаемым, а также для удобства изменения имён в одном месте.

Третий шаг.


Используем поиск по всему проекту, в зависимости от вашего редактора кода, который вы используете при разработке, это могут быть разные хот кеи, думаю вы их знаете, поэтому останавливаться тут не буду.
Вбиваем:
is_authenticated()

И меняем на
is_authenticated
. Теперь это не метод, а свойство. Эта ошибка будет вызывать исключение.
Далее в проекте ищем:
from django.core.urlresolvers import reverse 

И меняем на:
from django.urls import reverse

Четвёртый шаг.


Теперь во всех models.ForeignKey, должен быть обязательный позиционны аргумент “on_delete” например:
on_delete=models.CASCADE
on_delete=models.DO_NOTHING
on_delete=models.SET_NULL

Далее делаем:

python manage.py makemigrations
python manage.py migrate

Пятый шаг.


Если вы попытаетесь запустить проект, то он уже должен запуститься, но сразу он вам выдаст ошибку, как только вы зайдёте на 127.0.0.1:8000.
Ошибка будет следующая:
AttributeError at /
‘WSGIRequest’ object has no attribute ‘user’

Она происходит из-за того, что нужно переименовать MIDDLEWARE_CLASSES на MIDDLEWARE
Далее вы получите следующую ошибку в консоли:
django.core.exceptions.ImproperlyConfigured: WSGI application 'application' could not be loaded; Error importing module: 'application doesn't look like a module path
Эта ошибка происходит из-за того что у вас старые middleware, и вы должны их обновить на:

    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware'

Шестой шаг.


Если вы используете собственные middleware в проекте, то они должны наследоваться от MiddlewareMixin, а не от object (можно и через object, но тогда нужно прописывать дополнительные обязательные методы)
Импорт:
from django.utils.deprecation import MiddlewareMixin 

На этом всё! :)
Конечно, если у вас очень большой проект и вы используете большое количество пакетов, то проблем у вас будет больше, но уже цепочка ошибок в консоли вам поможет их решить и запустить проект в должном режиме. В данном гайде описаны основные ошибки и способы их решения, которые актуальны для всех проектов с Django 1.9 (некоторые моменты не актуальны для версии Django 1.11), и помогут быстрее перенести проект на Django 2.0, а так же избежать лишней потери времени на разбор и поиск решений типичных ошибок.

Let's block ads! (Why?)

Комментариев нет:

Отправить комментарий