2019年8月に投稿した記事

DjangoのmessagesをCloud9で使いたい

表題の件そのまんまなのですが、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-allauthの認証画面へ遷移するためのnameについて

個人的にDjangoの認証機能はdjango-allauthを使っています。
だって、認証機能をいちいち作るのはめんどくさいですし、バグが出たら最悪です。

テンプレート作成時にdjango-allauthがあらかじめ作っているurlへアクセスするためのurlの引数を忘れてしまうので備忘録も兼ねて書いておこうと思います。

目次

  1. 認証について
  2. メールについて
  3. パスワードリセットについて

認証について

以下の表は認証系への移動のためのurlです。

こいつらはユーザの設定画面とか、ナビバーで使うと思います。
account_change_passwordとaccount_set_passwordの違いはパスワードが使えるならchangeへ移動、使えないならsetへ移動します。

画面 名前 スニペット
Sign upaccount_signup{% url ‘account_signup’ %}
Log inaccount_login{% url ‘account_login’ %}
Log outaccount_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_passwordreplace
パスワードリセット要求後の画面account_reset_password_donereplace
届いたメールアドレスからアクセスする画面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