このページでは、Django の自動リロード機能(オートリロード機能)について紹介していきます!
Django では自動リロード機能はデフォルトで有効になっていますし、Django 使っている方からすれば当たり前の機能かもしれません(そもそも公式チュートリアルや参考書でも説明されている)。
が、実際に私が知らなかったように、自動リロード機能を知らずに Django を使っている方もおられるかもしれませんので、そういった方向けに自動リロード機能の紹介記事を作成してみました。
機能の説明だけでなく、この機能を OFF にする方法や、逆に不便だと感じだ点なども紹介していきたいと思います。
Django の自動リロード機能とは
自動リロード機能は、開発用ウェブサーバー起動中にスクリプトの変更を行なった際に、手動でウェブサーバーを再起動することなく、自動的に変更内容を反映してくれる機能です。
公式チュートリアルでは下記のように説明されています。
runserver の自動リロード
開発サーバーは必要に応じてリクエストごとにPythonコードを自動的にリロードします。コード変更の効果を得るためにサーバーを再起動する必要はありません。しかしながら、ファイルの追加のようないくつかの行動は再起動をトリガーしません、このような場合はサーバーを再起動する必要があります。
引用元:Django 公式チュートリアル
Django の開発用ウェブサーバーを起動する際に下記のコマンドを実行すると思いますが、このコマンド実行中(つまり開発用ウェブサーバー実行中)に Django プロジェクトや Django アプリの Python スクリプト(views.py
や urls.py
など)を変更すると、手動で開発用ウェブサーバーを再起動することなく、その変更が自動的に反映されます。これが自動リロード機能です。
% python manage.py runserver
ちなみに自動リロード機能が動作している際には、上記コマンドを実行すると次ののメッセージが表示されます。
Watching for file changes with StatReloader
例えば、元々の views.py
が下記のようなものであり、
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello Django!!!')
ウェブブラウザからアプリを動作させたときに表示される画面が下記のようなものであるとすると、
views.py
を下記のように変更すれば('Hello Django!!!'
を 'Good bye Django...'
に変更しただけ)、
from django.http import HttpResponse
def index(request):
return HttpResponse('Good bye Django...')
自動的に変更内容が反映され、再度ウェブブラウザからアプリを動作させた際に表示される画面が変化することになります(開発用ウェブサーバーを手動で再起動しなくても画面が変化する)。
もし自動リロード機能が無いのであれば、Python スクリプトを変更したとしても起動中のウェブサーバーにその変更が反映されず、変更前のスクリプトの状態でアプリも動作することになります。
なので、変更を反映するためには、一旦 Ctrl
+ c
や control
+ c
などを入力してウェブサーバーを終了させ(python manage.py runserver
を終了させる)、再度下記コマンドで開発用ウェブサーバーを起動させることで Python スクリプトを反映させる必要があります。
% python manage.py runserver
そのため、自動リロード機能が無ければ、スクリプトを変更するたびに開発用ウェブサーバーの終了と再起動の手順が必要になって手間がかかります。それに対して Django の自動リロード機能があれば、これらの手順を行う必要がないため開発時の手間を減らすことができます。
私は VSCode で Django のアプリの開発を行なっていますが(開発しているというか勉強している)、自動リロードが動作した後であれば、変更後のスクリプトに対するブレークポイントの設定や、追加した変数の中身の確認も可能であることを確認しています。便利ですね…。
ちなみに、VSCode を使った Django のデバッグ環境の構築に関しては下記ページで解説していますので、興味があればぜひ読んでみてください。
【VSCode】Django のデバッグ環境の構築手順おそらく私のように、スクリプトを変更する度に毎回開発用ウェブサーバーの再起動を手動で行なっていた方もおられるかもしれませんが、Django の場合はその必要がありません。
ただ、この章の最初に引用で示した公式チュートリアルの説明にも記載されていますが、全ての変更(例えばファイルの追加など)に対して自動リロード機能が有効であるというわけではないようなので、変更内容が反映されていない場合は開発用ウェブサーバーを手動で再起動させる必要があります。
また、自動リロード機能が動作した際には、下記のようなログが標準出力に出力されます。実際に、開発用ウェブサーバー起動中にファイルを変更してみれば、下記のログが出力されることが確認できると思います(settings.py
で DEBUG = False
にしていると最初の2行は表示されないはず)。
<変更したファイルのパス> changed, reloading. Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). February 17, 2022 - 22:28:38 Django version 4.0.2, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
ちょっとソースコードを読んでみた感じだと、定期的に(1秒ごとに)各ファイルの最終更新日?が変化していないかどうかを Django 本体側(autoreload.py
)で確認するようになっており、変化している場合に自動リロード機能が動作するようになっているようです(結局一旦終了してから再度 python manage.py runserver
実行している感じ?)。
Django の自動リロード機能を OFF にする方法
もし、Django の自動リロード機能を OFF にしたい場合は、python manage.py runserver
を実行する際に --noreload
オプションを指定するようにすれば良いです。
python manage.py runserver --noreload
これによって、上記コマンド実行中に Python スクリプトを変更しても自動で反映されず、開発用ウェブサーバーを再起動しない限りは変更前の状態でアプリを動作させることができます。
スポンサーリンク
自動保存とは相性悪い?
自動リロード機能はすごく便利なのですが、自動保存機能とは相性がちょっと悪いかもしれないですね…。もしかしたらいい解決方法があるかもしれませんが…。
私は VSCode でファイルの自動保存機能を有効にして開発を行なっているのですが、例えば下記のように views.py
に関数を追加しようとして def
とだけ記述し、
from django.http import HttpResponse
def index(request):
return HttpResponse('Good bye Django...')
def
この状態で「関数名は何にしよっかなー」って悩んでいると、その間に自動保存機能が動作して views.py
が保存されます。
ファイルが保存されると、ファイルが変更されたことを Django が検知して自動リロード機能が動作し、その中で views.py
の import
が行われ、def
とだけ書かれている行があるので下記のようなエラーが発生してしまいます。
例外が発生しました: SyntaxError invalid syntax (views.py, line 6) File "/Users/daeu/Documents/python/django_app/hello/urls.py", line 2, in from . import views
こんな感じで、自動保存機能を利用していると、ウェブサーバー起動中にファイルを編集した際に編集途中で自動保存が行われることがあり、それによってエラーが発生してしまうことが多いです。
VSCode の自動保存機能を OFF にしてしまえば解決するのですが、そうなると毎回手動でファイル保存しないとダメなので面倒ですし、ファイルの保存忘れも起こりうるのでイマイチなんですよね…。
エラー出てもその後にファイル編集を完成させれば、完成後にまた自動リロード機能が働いて正常に動作してくれるので気にしないようにしていますが、エディターの自動保存機能と Django の自動リロード機能を併用するとエラーが発生することが多くなる可能性があるので注意してください。
まとめ
このページでは、Django の自動リロード機能について解説しました!
「ソースコードを変更したら必ずプログラムを再起動する必要がある」と思い込んでらっしゃる方もおられるかもしれませんが(私もそうでしたし…)、Django の場合は自動で変更が反映されるようになっています。
もし、ファイルを変更するたびに毎回手動で開発用ウェブサーバーの再起動を行なっている方がおられましたら、今後はその手間を減らすことができて開発が楽になると思いますので、どんどんこの自動リロード機能を有効活用していきましょう!