---
title: Webserver スタックのアップグレード時のプロセスと学び - Django のアップグレード (1.11 から 3.1)
author: Hue Team
type: post
date: 2021-03-09T00:00:00+00:00
url: /blog/2021-03-09-process-and-learnings-when-upgrading-the-webserver-stack-django-upgrade-1-to-3
sf_thumbnail_type:
- none
sf_thumbnail_link_type:
- link_to_post
sf_detail_type:
- none
sf_page_title:
- 1
sf_page_title_style:
- standard
sf_no_breadcrumbs:
- 1
sf_page_title_bg:
- none
sf_page_title_text_style:
- light
sf_background_image_size:
- cover
sf_social_sharing:
- 1
sf_related_articles:
- 1
sf_sidebar_config:
- left-sidebar
sf_left_sidebar:
- Sidebar-2
sf_right_sidebar:
- Sidebar-1
sf_caption_position:
- caption-right
sf_remove_promo_bar:
- 1
ampforwp-amp-on-off:
- default
categories:
- Version 4.10
- Development
---
Hue プロジェクトは約[10年前](/blog/2020-01-28-ten-years-data-querying-ux-evolution/) に開始されました。その間にいくつかの技術が古くなったり、非推奨になったりしたため、HUE の明るい未来のためにそれらをアップグレードする必要がありました。その中でも [Django](https://www.djangoproject.com/) のアップグレードは最も重要な者の一つでした。アップグレード前は Django 1.11 を使用していましたが、2020年4月に延長サポートが終了しました。

## ゴール
* 1.11 のコンパイル/事項が可能ななま Django 3.1 (最新) で Hue が動作すること。
## アップグレードの理由
* 古いバージョンである [Django 1.11 は非推奨](https://www.djangoproject.com/download/#supported-versions)です。(例: セキュリティアップグレードや改善が受けられなくなります)。
* Django 1.11 には Python 2 が必要ですが、これも[非推奨](https://docs.djangoproject.com/en/3.1/faq/install/#what-python-version-should-i-use-with-django)です。
* [新しい機能、バグフィックス、改善](https://docs.djangoproject.com/en/dev/internals/deprecation/)が追加されています。
* 新しい Django のリリースが利用可能になるたびにアップグレードすると、コードベースを最新に保つことができ、将来のアップグレードの負担が軽減されます。
* 古いバージョンの Django をサポートしていない機能やライブラリもあります。(例: [DjangoRest framework](https://www.django-rest-framework.org/#requirements))。
## 課題
* 下位互換性を壊さないようにする。すなわち、同じコードベースで両方のバージョンをサポートする(選択肢がない場合は sys.version_info[0] < 3 スイッチを使用する)。
* 私たちの製品の依存関係の中には Django の新しいバージョンをまだサポートしていなものがあります。このような場合は、依存関係がある製品の新しいバージョンがリリースされるまで待たなければならないかもしれません。
## 計画
* 大きなトレードオフ:
* Hue の Python 3 のビルドは Django 3 に移行する
* Python 2 は Django 1.11 のまま (Django 1.11 は Python 2 をサポートする最新バージョンなので)
* ゆっくりではあるがしかし完璧に、後戻りしないように、私たちは Django を 1.11から 2.0、2.0から2.1、2.1から2.2、2.2から3.0、3.0から3.1へと段階的にアップグレードすることにしました。
* 次のバージョンにアップグレードする前に、現在の Django のバージョンで発生した deprecation の警告を解決し、google sheet に保存します。
* 警告を解決したら、計画通りに Django を次のバージョンへとアップグレードします。
* 両方のバージョン(最後のバージョンとアップグレードしたバージョン)について、全ての[ユニットテスト](https://docs.gethue.com/developer/development/#testing)を実行します。テストが失敗した場合は、ユニットテストかアップグレードした関連部分の何かを修正する必要があります。
* ビルド、パッケージ化、テストを行うための一貫した自動化の方法として [CircleCI](https://circleci.com/product/#how-it-works) を使用しています。
* 
* 各コミットは CircleCI をパスしており、上のスクリーンショットでは CircleCI が両方のバージョン(build-py3.6 -> Django 3 and build -> Django 1.11)のコードをチェックしていることがわかります。
* 
* そして、このスクリーンショットでは、Django 1.11 (build) でコミットが失敗していることがわかります。これは、私たちのコードが Django 1.11 で失敗していることを示しているので、それに応じてコードを変更する必要があります。
* 以上の手順を毎回行えば、新しいバージョンに対応することができます。
* Rinse and repeat (訳注: リンスは2度をお勧めします) :)
## 主な変更と学んだこと
* Django 1.11 から 2.0
* この移行では、主に2種類のアップグレードの修正が必要です
* 機能的な引数の追加や非推奨
* 古い依存関係が新しいバージョンの Django をサポートしていない
* しかし、“settings.MIDDLEWARE_CLASSES を使った古い形式のミドルウェアは非推奨” という大きな変更点があったので、2つの方法がありました。
* 自分でミドルウェアを書く。
* Django 1.10 形式のミドルウェアをアップグレードする。
* 私たちは後方互換性を求めているので後者の方法をとり、[instructions](https://docs.djangoproject.com/en/1.10/topics/http/middleware/#upgrading-pre-django-1-10-style-middleware)に注意深く従いました。
* Django 2.0 から 2.1
* このアップグレードでは、“desktop.auth.backend.AllowFirstUserDjangoBackend.authenticate() が位置的な `request` 引数 を受け入れる必要がある“ という大きな変更があり、Python 2 + Django 1.11 と Python 3 + Django 2.1 の両方でコンパイルできるようにすることが課題となったので、sys.version_info[0] フラグ (つまり Python のバージョン) を使ってこの問題を解決しました。
* しかし、上記のアップグレードの際、LDAP 認証機能を見落としていたため、Django 3 になってからこの問題が発生しました。この問題は解決できましたが、本当の教訓は、可能な限り全てのものにユニットテストを追加することで、LDAP 認証用のモックユニットテストを追加しました。
* Django 2.1 から 2.2
* 大きな問題は Django の admin アプリに関するものでした。基本的に Django 2.2 では admin アプリでエラーが発生していたので、mako テンプレートが原因ではないかと考えましたが、Django admin をそのようには使用しておらず、mako を[Vue.js](https://gethue.com/blog/vue3-build-cli-options-composition-api-template-web-components-hue/) に置き換えることもしていなかったので、これを無効化して、将来必要にあったら追加することを考えて進めました。
* Django 2.2 から 3.0
* この移行では、‘django-babel’ という名前のサードパーティの依存関係が Django 2.2 までしかサポートしていないというエラーが出ました。議論の結果、[フォーク](https://github.com/gethue/django-babel)して setup.py ファイルを適宜変更すれば Django 3.0 で動作するようになることがわかりました。
* Django 3.0 から 3.1
* 大きな変更はなく、‘STATICFILES_STORAGE’ が CachedStaticFilesStorage からManifestStaticFilesStorage に変わっただけでした。
## それでは Hue with Django 3 を試してみましょう!
```
git clone https://github.com/cloudera/hue.git # Clone the Hue repository
export PYTHON_VER=python3.8 # Before build set the Pyhton_VER like
make apps # build the apps
./build/env/bin/hue runserver
```
注: 問題が発生した場合はこちらの[リンク](https://docs.gethue.com/developer/development/)を参照して下さい。
ご意見や質問がありましたらお気軽にこちら、あるいは Discussions までコメントして下さい。quick start で SQL をクエリして下さい!
どうぞよろしくお願いします!
Ayush from the Hue Team