DjangoのmessagesをCloud9で使いたい

django-logo

表題の件そのまんまなのですが、Djangoの開発で嵌ったやつです。笑

開発は大体Cloud9上で行っているのですが、時々AWSのCloud9の挙動によって思わぬ動きになってしまいます。

今回はDjangoのmessagesフレームワークの使い方を学んでてどうしても意味が分からなくて時間を使ってしまったので備忘録を込めて書いておきまーす。

結論

settings.pyに以下の設定をしましょう。


MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

以上終わり。

この設定は何?

Djangoのメッセージフレームワークではメッセージエンジンを設定できます。ドキュメント上では以下の4つが記載されています。

  • storage.session.SessionStorage
  • storage.cookie.CookieStorage
  • storage.fallback.FallbackStorage
  • storage.base.BaseStorage

上記のFallbackStorageがデフォルト設定となっておりますので、これをSessionStorageに設定しています。

なんでこれでいいの?

この問題はDjango側ではなく、AWSのCloud9側が原因のようです。
Django側ではクッキーの内容ををドルマークで区切っているのですが、AWS側でドルマークを削除しています。このクッキーの操作のずれが今回の原因です。

さて、先ほどのFallbackStorageはなんなのでしょうか?Djangoのドキュメントでは以下のように書かれています。

まず CookieStorage を使い、単一の Cookie に合わないメッセージに対して SessionStorage を使います。Django の contrib.sessions アプリケーションも必要となります

https://docs.djangoproject.com/ja/2.2/ref/contrib/messages/

そうです。パフォーマンスを最大化するための処置としてCookieをまず使っているんですね。
ですから、今回の事象が起こったというわけです。

まとめ

cloud9でメッセージフレームワークを使う場合はMESSAGE_STORAGEの設定を変更しましょう。その場合は開発環境と本番環境で設定を変更させる必要があります。忘れないようにしましょう!(私もですが。。)

スタックオーバーフローで回答されているので詳細はご参照ください

Django message framework issue on C9 platform