前回の続きで、くじ引きアプリを作成していきます。
【前回のまとめ】
・自分が投稿した内容だけをくじの結果とする
【今回の作業】
・投稿者以外の人が内容を削除できないようにする
・外部からアクセスしてみる
今回は自分が投稿した内容削除できるようにするのと、外部からアクセスするための設定を行います。
現在のコードのままURLに「http://localhost:8000/tdl/ID/delete」と入力すると、別の投稿者の内容の削除画面に行けてしまいますので、これはセキュリティ的に大問題です。
また、Webサービスは最終的にインターネットに公開することが目的なので、どこからでもアクセスできるようにしておく必要があります。
設定は今までの差分を利用しますので、初めから設定したい方は以下記事を参照してください。
投稿者以外の人が内容を削除できないようにする
【手順】
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
それでは確認してみます。
次の手順で確認していきます。
- 以下URLにブラウザでアクセスする
http://192.168.88.128:8000/tdl - 未ログインユーザの状態で一覧画面から、以下のURLを入力する
http://192.168.88.128:8000/tdl/1/delete - サーバーエラー画面が表示されることを確認
以上で今回の目的である、投稿者以外の人が内容を削除できないようにする
ことと、外部からアクセスすることができました。
ありがとうございました。
コメント