メニュー 閉じる

Django Channels(ASGI)についての勉強メモ

PythonのWebフレームワークであるDjangoで非同期通信を行う場合は、
Channelというパッケージを導入する必要がある。

具体的に言えば例えばチャットなどの非同期サーバーを起動することが可能になる。

ChannlesはWebアプリケーションとWebサーバを接続する標準仕様である
WSGIの精神的続編であるASGIを利用しているということで期待が高まる。(適当)

カタカナ語が気になったので補足を入れた(2020/11/19)

 

前提

 

そもそも、Python Djangoにおけるmigrateって何?

 

Channelsサーバーを立ち上げるにはマイグレーションが必要だ(キリッ)
そう書いてあるがどういう意味か考えたことがなかった。

調べてみるとモデルをデータベースに反映することをmigrateという。
migrateするとデータベース構成を変更したり、逆に取り消す事もできる。
しかし、データベース構成を戻したいときにGitのようにバージョン管理されてないと戻せない。

そのような時のためmakemigrationsというコマンドもあり、これはマイグレーションファイルを作成する。
現在のマイグレーションを見たいときは「shownmigrations」コマンドを利用する。

$ python manage.py showmigrations
admin
[ ] 0001_initial
[ ] 0002_logentry_remove_auto_add
[ ] 0003_logentry_add_action_flag_choices
auth
[ ] 0001_initial
[ ] 0002_alter_permission_name_max_length
[ ] 0003_alter_user_email_max_length
[ ] 0004_alter_user_username_opts
[ ] 0005_alter_user_last_login_null
[ ] 0006_require_contenttypes_0002
[ ] 0007_alter_validators_add_error_messages
[ ] 0008_alter_user_username_max_length
[ ] 0009_alter_user_last_name_max_length
[ ] 0010_alter_group_name_max_length
[ ] 0011_update_proxy_permissions
[ ] 0012_alter_user_first_name_max_length
contenttypes
[ ] 0001_initial
[ ] 0002_remove_content_type_name
sessions
[ ] 0001_initial

それでは、実際にChannelsサーバーを起動しよう。

$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
November 11, 2020 - 09:47:55
Django version 3.1.2, using settings 'ideaTools.settings'
Starting ASGI/Channels version 3.0.1 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

サーバーは起動できるが、適用されていないマイグレーションが18個存在すると表示されている。
そのため一度サーバーを停止させて(「control + C」)
「python manage.py migrate」でマイグレーションを行う。

$ python manage.py migrate

$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 11, 2020 - 09:55:28
Django version 3.1.2, using settings 'ideaTools.settings'
Starting ASGI/Channels version 3.0.1 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

これによりDjangoサーバーではなくASGI/Channelsサーバーが起動した。

Django3.0の非同期サーバーを体験してみた
https://qiita.com/Syoitu/items/17cff5061b13463d45fd

 

そうは言ってもASGIって何?

 

ASGIはWSGIの精神的続編という誉れ高き地位にあるモノらしい。これは全集中の呼吸で挑まねばならない。
しかし、これもまた例にもれず省略語であり「Asynchronous Server Gateway Interface」の略である。

ASGIではアプリケーションをデフォルトで非同期の呼び出し可能なオブジェクトとして定義している。

このASGIは当然ながらASGIは成功したWSGIの正当な後継者である。
このASGIの目標は、Webサーバー、フレームワーク、および非同期Python WSGIなどの、
アプリケーション間の標準的な互換性を維持することである。

詳しい話はASGIの公式を読んだほうが良いのだがWSGIでは駄目だった理由を要点だけ日本語訳すると、

 

  • WSGIは単一呼び出し可能なインターフェイスとなっており、
    WebSocketのようなより複雑なWebプロトコルに適していない
  • WSGIはロングポーリングHTTPまたはWebSocket接続など長期間の接続を許可しない
  • 複数の着信イベント(WebSocketフレームの受信など)を持つプロトコルはトリガーできない

 

色々とWSGIも時代の変化に耐えきれずにいたところで、
ASGIがWSGIのスーパーセット(カタカナ語を使いすぎ「上位互換」という意味)として設計されたことがわかる。

この2つに完璧な互換性があるかどうかは知らないが、変換する方法は定義されている。
WSGIアプリケーションはasgiref ライブラリを介してASGIサーバー内で実行することができる。