🙆‍♀️

【Django】Pythonで作るRest API【18Error Handling】

2023/02/05に公開

【18Error Handling】

YouTube: https://youtu.be/IRmUT-Xm-lE

https://youtu.be/IRmUT-Xm-lE

今回はエラー画面が気になる方向けに
「getPostById」のビューを使って
簡単なエラーハンドリングについて解説します。

例えば現状ですと、
「Post」の個別データを取得しようとして、
存在しない「id」をURLに設定しますと
エラー画面が表示されてしまいます。

このエラー画面が出ないように
「try」「except」を使用して、簡単なエラーハンドリングを実装します。

myapp/posts/views.py
from django.shortcuts import render
from django.http import HttpResponse
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404

# Create your views here.
def helloWorld(request):
  # return HttpResponse('Hello World')
  hello = 'hello'
  return render(request, 'posts/index.html', {})

@api_view(['GET'])
def getAllPosts(request):
  posts = Post.objects.all()
  serializer = PostSerializer(posts, many=True)

  return Response(serializer.data)

@api_view(['POST'])
def createPost(request):
  data = request.data
  user = request.user

  post = Post.objects.create(
    title = data['title'],
    content = data['content'],
    author = user
  )

  serializer = PostSerializer(post, many=False)
  return Response(serializer.data)

@api_view(['GET'])
def getPostById(request, pk):
  post = get_object_or_404(Post, id=pk)

  try:
    # post = Post.objects.get(id=pk)
    serializer = PostSerializer(post, many=False)
    return Response(serializer.data)
  except:
    return Response({"error": "Something went wrong..."}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


@api_view(['DELETE'])
def deletePost(request, pk):
  post = Post.objects.get(id=pk)
  post.delete()

  return Response({'message': 'delete success'})

@api_view(['PUT'])
def updatePost(request, pk):
  data = request.data
  post = Post.objects.get(id=pk)

  post.title = data['title']
  post.content = data['content']
  post.published = data['published']

  post.save()

  serializer = PostSerializer(post, many=False)
  return Response(serializer.data)

class PostViewSet(viewsets.ModelViewSet):
  queryset = Post.objects.all()
  serializer_class = PostSerializer

Discussion