現在の新聞のウェブサイトにはいくつかの問題があります。
一つは、私たちの新聞が財政的に持続可能であることを望みます。
より多くの時間をかけて、有料の有料アプリをアクセス用に追加することができましたが、今のところ記事を表示するにはログインする必要があります。
これは承認と呼ばれます。
サイトの領域を表示する権限を与えられている人の周りには、さまざまなルールを設定するのが一般的です。
これは、ユーザーの登録およびログインのプロセスである認証とは異なることに注意してください。
認可によってアクセスが制限されます。 認証はユーザがサインアップしてログインすることを可能にする。
成熟したWebフレームワークとして、Djangoには、すぐに使用できる認証機能が組み込まれています。
この章では、さまざまなページへのアクセスを、ログインしているユーザーだけに制限します。
現在、新しい記事の著者はどのユーザーにでも設定できます。
代わりに、自動的に現在のユーザーに設定する必要があります。
既定のCreateViewは、私たちのために多くの機能を提供しますが、現在のユーザーを作成者に設定するには、カスタマイズする必要があります。
作者はフィールドから削除され、form_validメソッドを使用して自動的に設定されます。
-- code --
このようにCreateViewを更新する方法を知ったのですか?
答えは、私はソースコードを見て、Googleを使いました。
一般的なクラスベースのビューは新規プロジェクトの開始には驚異的ですが、カスタマイズしたい場合は、あなたの袖を巻き上げて、何が起こっているのかを理解する必要があります。
ビルトインビューを使用してカスタマイズするほど、このようなカスタマイズをより快適に行うことができます。
あなたがやろうとしていることは、Django自身の中かStack Overflowのようなフォーラムのどこかで既に解決されている可能性があります。
助けを求めるのを恐れることはありません!
ブラウザをリロードして、トップナビゲーションの[新規]リンクをクリックしてみてください。
それは、作成者がもはやフィールドではない更新された作成ページにリダイレクトされます。
新しい記事を作成して管理者に行くと、現在ログインしているユーザーに自動的に設定されていることがわかります。
現在のプロジェクトでは、権限の不足に関する複数の問題があります。
明らかに、ユーザーのみにアクセスを制限したいので、読者に私たちの新聞を請求するオプションがあります。
しかしそれを超えて、正しいURLを知っているランダムにログアウトしたユーザーは、サイトのどの部分にもアクセスできます。
ログアウトしたユーザーが新しい記事を作成しようとした場合にどうなるか考えてみてください。
それを試してみるには、ナビゲーションバーの右上にあるユーザー名をクリックし、ドロップダウンオプションから「ログアウト」を選択します。
ナビゲーションバーから「新規」リンクが消えますが、直接移動するとどうなりますか?
http://127.0.0.1:8000/articles/new/%EF%BC%9F
ページはまだそこにあります。
今、タイトルと本文で新しい記事を作成しようとします。 [保存]ボタンをクリックします。
エラー! これは、現在のログインユーザにリンクされている著者フィールドが必要であるためです。
しかし、私たちはログインしていないので、著者は存在しないため、投稿は失敗します。
何をすべきか?
いくつかの権限を設定して、ログインしているユーザーだけがサイトにアクセスできるようにする必要があります。
これを行うために、mixinを使用することができます。
これは、Djangoが重複したコードを避けてカスタマイズを可能にするために使用する特別な多重継承です。
たとえば、組み込みの汎用ListViewでは、テンプレートを返す方法が必要です。
しかし、DetailViewと同様に、ほとんどすべての他のビューがそうです。
Djangoは、それぞれの大きな一般的なビューで同じコードを繰り返すのではなく、この機能をTemplateResponseMixinと呼ばれる「mixin」に分解します。
ListViewとDetailViewの両方でこのミックスインを使用して、適切なテンプレートをレンダリングします。
Githubで自由に入手できるDjangoのソースコードを読んだら、そこにmixinが使われているのを見ることができます。
表示アクセスをログインユーザだけに制限するため、DjangoにはLoginRequiredミックスインがあります。
それは強力で非常に簡潔です。
articles / views.pyファイルの上部にインポートし、次にLoginRequiredMixinをArticleCreateViewに追加します。
ミックスインがListViewの左にあるようにして、最初に読み込まれるようにしてください。
私たちは、ListViewがアクセスを制限しようとしていることを既に知りたがっています。
以上です!もう終わった。
-- code --
http:// 127.0.0.1:8000で簡単にホームページに戻るので、フォームの再送信は避けてください。
次に新しいメッセージURLに直接アクセスしてください:
http:// 127.0.0.1:8000 / articles / new /
次の「ページが見つかりません」というエラーが表示されます。
何が起こっていますか? Djangoは/ accounts / loginにあるログインページのデフォルトの場所に自動的にリダイレクトしましたが、私たちがユーザーを使用しているプロジェクトレベルのURL /私たちのルートとして思い出しています。
だから私たちのログインページはusers / loginにあります。
では、ArticleCreateViewについてはどうか。
新しいメッセージを作成するためのリンクをもう一度試してください:http:// 127.0.0.1:8000 / articles / new / ユーザーはログインページにリダイレクトされます。 ちょうど私たちが望むように!
ここで、ビューのアクセスを制限することは、既存のすべてのビューの始めにLoginRequiredMixinを追加し、正しいlogin_urlを指定することにすぎないことがわかります。
ユーザーがログインしていなければ、メッセージを作成、読み込み、更新、または削除できないようにしたいので、残りの記事ビューを更新してみましょう。
完全なviews.pyファイルは以下のようになります:
-- code --
サイトに移動して、リダイレクトのログが現在正常に機能していることを確認します。
適切なURLが何であるかを知る必要がある場合は、まずログインして、作成、編集、削除、およびすべての記事の各ルートのURLを書き留めます。
私たちは進歩していますが、編集ビューと削除ビューの問題はまだあります。
ログインしているユーザーは、どの記事にも変更を加えることができます。
私たちが望むのは、記事の作者だけがこのアクセス許可を持つように、このアクセスを制限することです。
Djangoで使用される基本Viewクラスには、最初に呼び出されてからGCBVの権限をカスタマイズする最も一般的な場所である内部のdispatch()メソッドがあります。 我々
記事の作者が実際にログインしていて、変更しようとしているのと同じユーザーかどうかをチェックします。
articles / views.pyファイルの一番上に、PermissionDeniedをインポートする行を追加します。
次に、ArticleUpdateViewとArticleDeleteViewの両方のディスパッチメソッドを追加します。
スーパーユーザーアカウントからログアウトし、testuserでログインします。
コードがうまくいけば、あなたのスーパーユーザーが書いた投稿を編集したり、削除したりすることはできません。
代わりに、Permission Denied 403エラーページが表示されます。
私たちの新聞アプリはほぼ完了しています。
この時点では、適切なユーザーへのリンクの編集や削除の表示のみを行うなど、カスタムテンプレートタグを使用してアプリ全体を適切な形で表示するなど、これ以上のステップがあります。
私たちは記事を適切に構成し、権限と権限を設定し、ユーザー認証は順調に行っています。
必要な最後の項目は、仲間のユーザーが次の章で説明するコメントを残す機能です。