Djangoでくじ引きアプリを作ってみる_part14

lottery-146318_1280.png Django

前回の続きで、くじ引きアプリを作成していきます。

【前回のまとめ】

・自分が投稿した内容だけをくじの結果とする

【今回の作業】

・投稿者以外の人が内容を削除できないようにする
・外部からアクセスしてみる

今回は自分が投稿した内容削除できるようにするのと、外部からアクセスするための設定を行います。

現在のコードのままURLに「http://localhost:8000/tdl/ID/delete」と入力すると、別の投稿者の内容の削除画面に行けてしまいますので、これはセキュリティ的に大問題です。

また、Webサービスは最終的にインターネットに公開することが目的なので、どこからでもアクセスできるようにしておく必要があります。

設定は今までの差分を利用しますので、初めから設定したい方は以下記事を参照してください。

Djangoでくじ引きアプリを作ってみる_part1

Djangoでくじ引きアプリを作ってみる_part2

Djangoでくじ引きアプリを作ってみる_part3

Djangoでくじ引きアプリを作ってみる_part4

Djangoでくじ引きアプリを作ってみる_part5

Djangoでくじ引きアプリを作ってみる_part6

Djangoでくじ引きアプリを作ってみる_part7

Djangoでくじ引きアプリを作ってみる_part8

Djangoでくじ引きアプリを作ってみる_part9

Djangoでくじ引きアプリを作ってみる_part10

Djangoでくじ引きアプリを作ってみる_part11

Djangoでくじ引きアプリを作ってみる_part12

Djangoでくじ引きアプリを作ってみる_part13

投稿者以外の人が内容を削除できないようにする

【手順】

1.views.pyを変更

DewleteViewクラスに内容を変更するためviews.pyを変更します。

ファイル:myapptdl>tdl>views.py

コード:

class DeleteView(LoginRequiredMixin, generic.edit.DeleteView):
  model = Tdl
  success_url = reverse_lazy('tdl:index')

#以下を追加
  def dispatch(self, request, *args, **kwargs):
      obj = self.get_object()
      if obj.author != self.request.user:
          raise PermissionError('削除権限がありません')
      return super(Deletevies, self).dispatch(request, *args, **kwargs)

このコードを追加することで、投稿者IDとログインユーザIDが一致していない場合は、エラー(削除権限がありません)を表示します。

設定はこれだけです。

続いて外部からアクセスできるようにします。

外部からアクセスしてみる

現在の構成は、以下のようになっています。

ホストPC - VM(Ubuntu) - Django

そのため、ホストPCのブラウザからDjangoにアクセスできるかをまず確認します。
今回は外部からのアクセスを許可するため、runserverの後ろに、「0.0.0.0:8000」をつけてサーバを立ち上げます。

cd myapp 
python manage.py runserver 0.0.0.0:8000

ホストPCから以下のURLにアクセスします。

http://192.168.88.128:8000/tdl

そうすると、以下のエラーが出ます。

DisallowedHost at /tdl/
Invalid HTTP_HOST header: ‘192.168.88.128:8000’. You may need to add ‘192.168.88.128’ to ALLOWED_HOSTS.

これは、Djangoのアクセス制限がかかっているためです。

Djnagoに外部からアクセスできるよう制限を解除します。
この設定は、プロジェクトのsettigns.pyを変更します。

ファイル:myapptdl>myapptdl>settings.py

コード:

ALLOWED_HOSTS = ['*']

やり方は簡単で、「ALLOWED_HOSTS」に「’*’」を入力するだけです。

あと1点気になるところがあります。

それは、画面エラーが表示された時に、以下のようなコードが表示されるところです。

これを直すためには、同じくsettings.pyを修正します。

DEBUG = True
#DEBUG = False

それでは確認してみます。

次の手順で確認していきます。

  1. 以下URLにブラウザでアクセスする
    http://192.168.88.128:8000/tdl
  2. 未ログインユーザの状態で一覧画面から、以下のURLを入力する
    http://192.168.88.128:8000/tdl/1/delete
  3. サーバーエラー画面が表示されることを確認

以上で今回の目的である、投稿者以外の人が内容を削除できないようにする
ことと、外部からアクセスすることができました。

ありがとうございました。

コメント

タイトルとURLをコピーしました