슈코딩

[Django] DRF 특강 2,3일차 기본 개념 정리 본문

코딩공부/Django

[Django] DRF 특강 2,3일차 기본 개념 정리

Roshu 2022. 6. 20. 16:22

 

1. Stacktrace

에러 발생했을때, a함수안에 -> b함수안에 -> c함수에서 에러가 났다. 위 에러이미지처럼 

어디서 에러가 났는지 보여준다. 이처럼 스택 추적(stacktrace)은 프로그램에서 예외가 발생했을 때 어떻게 함수가

호출되었는지, 어디서 오류가 발생했는지를 특정할 수 있는 수단이다. 문제 발생시 원인 규명에 도움이 된다.

 

 

2. 가상환경 설치 venv

가상환경은 패키지들의 버전을 통일해서 개발 할 수 있게 하기위해서 사용한다.

버전이 다르게되면 어떤 컴퓨터에서는 기능이 작동하고 , 어떤 컴퓨터에서는 작동하지 않는 경우가 발생한다. 

 

설치 : python -m venv venv

실행 : venv/Scripts/activate

 

#실행 권한이 없을때

권한 리스트 조회 : Get-ExecutionPolicy -List

이미지에서 보이는 CurrentUser 의 권한이 Undefined로 되어있다면, 가상환경 실행이 되지 않는다. 

그래서 이미지처럼 RemoteSigned로 변경을 해주어야 한다.

 

권한 변경 : Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

 

 

3. 패키지 관리를 위한 requirements

현재 설치된 패키지들을 txt 파일로 생성 : pip freeze > requirements.txt

txt파일에 적힌 버전대로 패키지 설치 : pip install -r requirements.txt

 

 

4. Code Convention 

코드 컨벤션은 코드를 작성할때의 팀 혹은 언어 단위의 약속이다. 

#Python 기준

class 는 Pascal  ex) UserModel

class 가 아닌것은 Snake ex) 함수명 def login_view()

전부가 대문자면 상수, 변하지 않는값 ex) PIE = 3.14

 

5. http status Code

2xx : normal 

3xx : redirect

4xx : client error 

5xx : server error 

 

 

6. FBV, CBV Django View

FBV: Function Base View

def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')

        me = auth.authenticate(request, username=username, password=password)

        if me is not None:
            auth.login(request, me)
            return redirect('/select_genre')
            
        return render(request, 'user/login.html', {'error': '유저이름 혹은 비밀번호를 확인 해 주세요'})

    elif request.method == 'GET':
        user = request.user.is_authenticated
        if user:
            return redirect('/')

        return render(request, 'user/login.html')

CBV : Class Base View

class UserAPIView(APIView):
    permission_classes = [permissions.AllowAny]
    # 로그인
    def post(self, request):
        username = request.data.get('username', '')
        password = request.data.get('password', '')

        user = authenticate(request, username=username, password=password)
        if not user:
            return Response({"error": "존재하지 않는 계정이거나 패스워드가 일치하지 않습니다."})

        login(request, user)
        return Response({"message": "로그인 성공!!"})
    
    #로그아웃
    def delete(self, request):
        logout(request)
        return Response({"message": "로그아웃 성공!"})

 

 

7. 역참조 

class Hobby(models.Model):
    name = models.CharField(max_length=100)
    
    def __str__(self):
        return self.name

class UserProfile(models.Model):
    user = models.OneToOneField(User, verbose_name="유저", on_delete=models.CASCADE)
    introduction = models.TextField("자기소개", max_length=255)
    birthday = models.DateTimeField("생일")
    age = models.IntegerField("나이")
    hobby = models.ManyToManyField(Hobby, verbose_name="취미", related_name="")
    
    
    def __str__(self):
        return f"{self.user.username} 님의 프로필입니다."

위와 같은 유저프로필 모델을 가지고 예시를 들면 Userprofile 안의 hobby를 찾을때는 정참조 이다.

ex) user1이 가진 hobby는 1,2,3 

hobby 를 가지고 같은 hobby를 가진 유저를 찾게되면 역참조 이다.

ex) hobby 1 을 가진 user는 1,2,3

이처럼 외래키를 참조하는 Object를 역으로 참조 할 수 있다. 

 

related_name 은 역참조를 할때 사용하기 위해 설정을 해준다. 설정을 안하게 되면 객체이름에 _set이 자동으로 붙는다.

단, one-to-one 필드에 한해서 _set이 붙지 않고 서로 바라볼 수 있다. 

ex) userprofile_set (프로필과 취미 관계) (tablename_set)  / one-to-one(유저와 프로필 관계) : userprofile

상황에 따라서 _set이 붙는 경우가 직관적으로 역참조인것을 알 수 있어서 related_name을 꼭 설정해야 하는것은 아니다.

 

#정리

userprofile.hobby  > 정참조

hobby.userprofile_set  > 역참조, hobby를 참조하고 있는 UserProfile 테이블의 object를 가져옴

역참조를 활용해 특정 유저(나)와 같은 취미를 가진 유저를 찾을 수 있다. 

 

 

8. dir()

직관적으로 무엇을 할 수 있는지 알려주는 메소드, 다음과 같이 사용을 한다.

def get(self, request):
        user = request.user
        print(dir(user))
        return Response({})

이처럼 많은 정보가 print 되는데, user.fullname 과 같이 user안에서 무엇을 사용할 수 있는지 전부 알려준다.

그래서 user.userprofile 이렇게 참조를 하다가 에러가 생겼을때, 어떤것을 사용해야 되는지를 확인하는 등 디버깅 할때

용이하다. 

 

#print 출력 결과 직관적이게 보기 

1. 출력결과 복사 

2. 새로운 빈 파일에 복사

3. alt + z 로 줄 바꿈

4. 콤마 , 를 잡고 ctrl + F2 로 , 를 전부 잡음.

5. enter로 정렬 

 

'코딩공부 > Django' 카테고리의 다른 글

[Django] DRF의 꽃 Serializer  (0) 2022.06.24
[Django] Admin 페이지 커스텀  (0) 2022.06.24
[Django] DRF 특강 1일차  (0) 2022.06.15
[Django] 장고 템플릿(Template) 문법  (0) 2022.06.02
[Django] 5/31 아침퀴즈 복습  (0) 2022.06.01
Comments