表題の件そのまんまなのですが、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
個人的にDjangoの認証機能はdjango-allauthを使っています。
だって、認証機能をいちいち作るのはめんどくさいですし、バグが出たら最悪です。
テンプレート作成時にdjango-allauthがあらかじめ作っているurlへアクセスするためのurlの引数を忘れてしまうので備忘録も兼ねて書いておこうと思います。
目次
- 認証について
- メールについて
- パスワードリセットについて
認証について
以下の表は認証系への移動のためのurlです。
こいつらはユーザの設定画面とか、ナビバーで使うと思います。
account_change_passwordとaccount_set_passwordの違いはパスワードが使えるならchangeへ移動、使えないならsetへ移動します。
画面 |
名前 |
スニペット |
Sign up | account_signup | {% url ‘account_signup’ %} |
Log in | account_login | {% url ‘account_login’ %} |
Log out | account_logout | {% url ‘account_logout’ %} |
パスワード変更 | account_change_password | {% url ‘account_change_password’ %} |
パスワード設定 | account_set_password | {% url ‘account_set_password’ %} |
無効な画面 | account_inactive | {% url ‘account_inactive’ %} |
メールについて
これはどっちかというとテンプレートのほうを直すのがメインですが、一応上げておきます。
メールアドレスの登録と確認画面に移動できるようにすればオッケーですね
画面 |
名前 |
スニペット |
メールアドレスの登録及び確認画面 | account_email | {% url ‘account_email’ %} |
メールアドレスにメールを送った後の画面 | account_email_verification_sent | {% url ‘account_email_verification_sent’ %} |
届いたメールアドレスからアクセスする画面 | account_confirm_email | — |
パスワードリセットについて
これもメールと同じようにテンプレートを直すことがメインだと思います。
パスワードリセット要求時の画面に遷移できれば大丈夫ですね
画面 |
名前 |
スニペット |
パスワードリセット要求時の画面 | account_reset_password | replace |
パスワードリセット要求後の画面 | account_reset_password_done | replace |
届いたメールアドレスからアクセスする画面 | account_reset_password_from_key | —- |
パスワード変更後の画面 | account_reset_password_from_key_done | {% url ‘account_reset_password_from_key_done’ %} |
まとめ
おそらく、認証系の画面遷移を良く使うと思います。ナビバーで使いますので。。
その他はどうせなら一緒にまとめておこうということでまとめておきました。
ほとんどの人はテンプレートを綺麗にするためにhtmlのほうをいじるのではないでしょうか。
それでは今回はこのくらいで!
参考としたのは以下のリポジトリになります。それでは!
参考:django-allauth
https://github.com/pennersr/django-allauth/blob/master/allauth/account/urls.py