코딩 개발일지

test.py / 개인 과제 TypeError 오류 찡찡대기 본문

AI 본 교육/AI 8주차

test.py / 개인 과제 TypeError 오류 찡찡대기

호기호 2023. 9. 26. 01:16

test.py에서 test를 하는 이유

test 하지않았을 때 문제점 :

1. 시간낭비 : 매번 같은 값을 수동으로 입력해서 테스트

2. 복잡도 증가 : 새로운 기능이 추가될때마다 어디서 문제가 생겼는지 모를 수 있음

3. 허점 : 제대로 돌아가지 않는 기능을 테스트 해보지 못하고 넘어갈 수 있음

 

test 쓰는 이유 :

1. 버그 쉽고 빠르게 찾기 가능

2. 시간, 돈 아낄 수 있음

3. 신뢰도 상승

4. 문서화가 쉬움

5. 시간이 얼마나 걸리는 지 등의 performance 테스트 가능

6. 코드 복잡도 감소

등등등

 

test.py에서 test 작성 시, views.py에서 직접 내용만 쓸 수 있음.

(test 대상이 파이썬, 장고 등의 라이브러리, 프레임워크가 되어서는 안된다.)


※ 잡담 / 찡찡대기 ※

 

개인 프로젝트로 포스트맨을 이용한 개인 블로그 만들기 중.

회원가입, 로그인, 글 작성, 전체 글 보기 까지는 슈루루루룩 잘 됌.

근데 [ 글 수정/삭제/detail페이지get ] 이 안되는데 시간을 몇 시간 투자중... (1시넘음 ㅠ)

이건 무조건 고치고 간단 마인드가 꺾여버릴 것 같음.

views.py에 한 클래스 안에 get, put, delete를 넣어서 작성했고, 이 세개만 안되는 상황.

즉, 이 클래스가 뭔가 문제가 있다는 뜻.

그리고 오류내용은

TypeError: ArticleDetailView.get() got an unexpected keyword argument 'article_id'
[26/Sep/2023 00:59:38] "GET /articles/1/ HTTP/1.1" 500 95320

 

오류 내용에서도 볼 수 있는데, views.py의 ArticleDetailView class가 'article_id'를 인식을 못하는 중인것같음.

근데 연결 됐다고!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

urls.py

article_id 들어가 있고, class명 오타 없고, 문제없음.

from articles import views
from django.urls import path

urlpatterns = [
    path('', views.ArticleView.as_view(), name='article_view'),
    path('feed/', views.FeedView.as_view(), name='feed_view'),
    path('<int:article_id>/', views.ArticleDetailView.as_view(),
         name='article_detail_view'),
]

views.py

class명 맞고, article_id 다 정의해줬고, import도 다했고!!!!!!!!!!!!

# 게시글 보기/수정/삭제
class ArticleDetailView(APIView):
    def get(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        serializer = ArticleSerializer(article)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def put(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        if request.user == article.user:
            serializer = ArticleCreateSerializer(article, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)

    def delete(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        if request.user == article.user:
            article.delete()
            return Response("삭제완료", status=status.HTTP_204_NO_CONTENT)
        else:
            return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)

serializers.py

class ArticleSerializer 에서 fields 전부다 가져오고있고!!!!!!!

from rest_framework import serializers
from articles.models import Article


class ArticleCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ("title", "image", "content")


class ArticleListSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

    def get_user(self, obj):
        return obj.user.email

    class Meta:
        model = Article
        fields = ("pk", "title", "image", "updated_at",
                  "user")


class ArticleSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
   
    def get_user(self, obj):
        return obj.user.email

    class Meta:
        model = Article
        fields = '__all__'

migration 도 다 했고!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 뭐가 문젠데

발견하면 수정해서 글 작성할 예정,,,


발견완료 (현재시각 02:36)

나는 바보다.

처음에 프로젝트를 만들기 전에, 미리 views.py를 작성해놓았는데, ArticleDetailView 를 위에 작성하고, 아래에 pass로 작성해 버렸다... 난 바보다

# 게시글 보기/수정/삭제
class ArticleDetailView(APIView):
    def get(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        serializer = ArticleSerializer(article)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def put(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        if request.user == article.user:
            serializer = ArticleCreateSerializer(article, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)

    def delete(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        if request.user == article.user:
            article.delete()
            return Response("삭제완료", status=status.HTTP_204_NO_CONTENT)
        else:
            return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)


# 모아보기(feed)
class FeedView(APIView):
    def get(self, request):
        pass

    def post(self, request):
        pass


# 게시글 상세보기
class ArticleDetailView(APIView):
    def get(self, request):
        pass

    def post(self, request):
        pass