Djangoアプリケーションを作成した際に詰まった点と参考にした記事(バックエンド編)

Django

前提・対象読者

本記事では、以下前提があり、これからDjangoでWebアプリケーションを開発しようとしている方を対象にしています。

  • Djangoがウェブアプリ開発のためのフレームワークであることを理解している
  • Djangoの環境構築ができている

実際にWebサービス「Otokogi」を公開まで至るにあたり、疑問点解消に使用させていただいたサイトを備忘のためにも残しておきます。

カスタムユーザの作成

Djangoのデフォルトユーザモデル(django.contrib.auth.models.User)では、ユーザネームやパスワードをはじめとした基本的なユーザ情報のみ保持することができます。
例えばユーザ情報としてアイコン画像を持たせたいとなった場合、主には以下二通りの対応が考えられます。

  • デフォルトのユーザモデルと1対1の関係にある別モデルを定義し、そこにアイコン画像情報を持たせる。
  • デフォルトのユーザモデルを拡張した独自のユーザモデルを定義する
    後でモデルからデータを引っ張ってきて加工してクライアントに表示させたり、モデルの更新を行うことを考えると、圧倒的に後者のほうがお勧めです。
    いちいち別テーブルを結合してデータ操作をしなくていいならしないほうがいいですもんね。
    ここで、独自のユーザモデルってどう作るんだ?となり、だうえホームページさんの【Django】カスタムユーザー(独自のユーザー)の作り方を参考にしました。

    認証機能の作成

    Djangoはデフォルトで認証機能を提供しています。(django.contrib.authのパッケージとして提供されています)提供されているといっても、どう使うかイメージできなかったので、こちらのページを参考に認証機能を作成しました。
    Djangoでユーザログイン機能を実装する | Create it Myself (create-it-myself.com)

    ログイン後の遷移先ページの設定

    例えば、ユーザがログインが必要なページにアクセスしようとしたときにセッションが無効になっていたら、ログインページが表示されます。そのような場合、ログイン後にはユーザがアクセスしようとしていたページを表示させてあげるのが親切だと思います。
    (常にアプリのトップにリダイレクトされると不便ですよね。)
    これもまたまただうえホームページさんの【Django】LoginViewの使い方(クラスベースビューでのログインの実現)を参考にログイン後の遷移を実現しました。
    「next」パラメータを持たせることで、ログイン後に特定のページへアクセスできるようです。
    具体的には、「login.html」に以下1行追加してあげれば、ログインページにリダイレクトされたときに「next」パラメータとしてログイン後にアクセスするページの情報を持つことができます。

    <input type="hidden" name="next" value="{{ next }}">

    アプリケーション内部へのアクセスは必ず認証を必要とする

    認証が必要なページへアクセスされた場合にログインページにリダイレクトさせるよう処置をしました。Djangoの標準パッケージである「django.contrib.auth.mixins.LoginRequiredMixin」をインポートし、Viewクラスで継承するだけで実現可能でした。
    使用方法は上記の通りですが、より詳しい内容は公式リファレンスを参照されるとよいかと思います。

    認証済みのユーザにはログインページを表示しない

    すでにログイン済みのユーザがログインページにアクセスしようとした場合は、認証済みとしてアプリケーション内部のページを表示するように処置しました。
    以下のページを参考にし、ログインページ自体はDjango標準の「LoginView」を継承し、クラス変数であるredirect_authenticated_userをTrueにオーバーライドすることで、ログイン済みのユーザはsettings.pyのLOGIN_REDIRECT_URLで設定されているURLにリダイレクトされます。
    【Django】LoginViewの使い方(クラスベースビューでのログインの実現) | だえうホームページ (daeudaeu.com)

    新規ユーザ登録機能の実装

    Djangoのデフォルト認証機能では、ユーザ登録機能を提供していないため、自作する必要があります。
    基本的にはDjango標準のCreateViewを使用する形になりますが、以下見出しの点に注意が必要です。

    パスワードを暗号化してデータベースに保存する

    標準のCreateViewを実装するだけだと、パスワードが平文でデータベースに登録されてしまいます。
    一方で、認証機能ではデータベースのパスワードを複合して認証を行うため、「平文のパスワードを複合した文字列」と「平文のパスワード」が当然一致するわけもなく、正しく認証機能が動作しません。
    以下ページを参考にして、CreateViewのform_validメソッドでユーザモデルのset_passwordメソッドを使用することで、パスワードを暗号化してデータベースに保存することができます。
    DjangoでUserモデルのインスタンスにpasswordをsetするときにはset_passwordメソッドを使う – delhi09の勉強日記 (hatenablog.com)

    Modelのフィールドとして画像を登録できるようにする

    Djangoのデフォルトで「ImageField」が用意されているのでこれを使用します。
    公式リファレンスでも紹介されている通り、サイズの指定にはpillowというライブラリが必要になってきます。
    画像データの保存や、更新時に更新前のデータを削除する方法については別記事で解説しようと思います。

    おわりに

    いかがだったでしょうか。アプリケーションを開発するうえではトライアンドエラーの繰り返しです。
    筆者自身もPython、Djnagoを使って初めてアプリケーション開発を行ったこともあり、多々躓きました。これからDjangoでアプリケーション開発する方や、今まさにアプリケーション開発で躓いている箇所がある方のお役に立てればさいわいです。
    次回以降も、フロント編や今回の内容ひとつひとつをより詳細に解説した記事を引き続き書いていく予定ですので、今後ともよろしくお願いいたします。

  • コメント