Pull to refresh

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

Reading time3 min
Views12K
Здравствуйте, сегодня я хотел бы вам рассказать о том, как обновить проект с версии 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, а так же избежать лишней потери времени на разбор и поиск решений типичных ошибок.
Tags:
Hubs:
+24
Comments9

Articles