RkBlog

Hardware, programming and astronomy tutorials and reviews.

Wrażenia z aktualizacji młodego projektu do Django 1.7

Nowa wersja Django osiągnęła fazę beta i aż prosi się by jej spróbować i przetestować na posiadanych aplikacjach

Od piątku możemy cieszyć się beta wersją Django 1.7. Nowa wersja frameworka wprowadza wiele ciekawych zmian, w tym własny system migracji zastępujący migracje South. W firmie mamy jeden młody projekt, który nie wyszedł jeszcze poza wersję rozwojową. Wykorzystaliśmy go jako królika doświadczalnego i przeszliśmy z Django 1.6 do 1.7a2 i obecnie 1.7b2. Proces te nie był zbyt skomplikowany, czy wybuchowy, ale wymagał też nieco czasu...

Migracje, testy i baza danych

Tak jak radzi dokumentacja usunąłem stare migracje i stworzyłem startowe fałszywe. Jedną migrację musiałem przepisać - migrację dodającą funkcje do bazy Postgresa. W tym celu stworzyłem w pliku migracji funkcję, która tworzyła je wykonując surowe zapytania SQL. Nowe migracje umożliwiają to dzięki liście operations i komendzie migrations.RunPython:

def do_something(*args, **kwargs):
    print('hi!')

class Migration(migrations.Migration):
    dependencies = []
    operations = [
        migrations.RunPython(do_something)
    ]

Co jeszcze fajne w nowych migracjach to to że naprawiły nam testy wykorzystujące owe funkcje postgresowe. W przypadku migracji South nawet z włączonymi migracjami w czasie testów tych funkcji w bazie nie było i testy padały. Tak więc problem został rozwiązany zanim potrzebny okazałby się jakiś hak (albo wyszukanie błędu w konfiguracji ;))

Pola BooleanField potrzebują też default=False bo inaczej domyślnie dostaniemy nulla. W starszym kodzie zapewne natrafimy na bezargumentowe BooleanFieldy, co nie będzie kompatybilne z nowszym Django.

Deploy

Nasz projekt używa Vagranta i pracujemy na konfiguracji jak najbardziej zbliżonej do produkcyjnej. Zamiast serwera deweloperskiego jest nginx, supervisor i gunicorn. Na Vagrancie dodatkowo działa sobie proces obserwujący zmiany w plikach i restartujący gunicorna gdy zajdzie potrzeba (albo collectstatic). Prosto po aktualizacji gunicorn całkowicie się wysypał i wyglądał jakoby byłby zupełnie niezgodny z nowym Django.

Pirwszą poprawką było odpalania go po nowemu - gunicorn MY_APP_NAME.wsgi:application zamiast gunicorn_django. Skrytym wysypywaczem gunicorna okazał się też django-debug-toolbar. Całkowite usunięcie DDT pozwoliło uruchomić się gunicornowi bez problemu. Oba źródła powodowały (na to wygląda) użycie gunicorn/app/django_wsgi.py, które jest przestarzałe i nie powinno być już używane (przy okazji niezgodne z Django 1.7).

Jeżeli dostaniecie z gunicorna wyjątek typu:
ImportError: No module named 'django.core.management.validation'
To będzie oznaczać że właśnie uderzył on w django_wsgi.py. DDT generował też wyjątek braku urlpatterns w pliku z urlsami.

Z mniejszych zmian w deploju aplikacji - znika south z aplikacji i zależności, jak i wywołanie syncdb. Polecenie migrate zostaje, ale jest już częścią Django, a nie Southa.

Na zakończenie

Jak na razie Django 1.7 działa bez problemów. Co prawda zbyt dużo django-zależnego kodu nie mamy, ale po zmianie z 1.6 na 1.7 nic nie wybuchło. Projekty z długą historią migracji, czy fixturami mogą mieć większą rozrywkę przy aktualizacji ;)

RkBlog

23 March 2014;

Comment article