슈코딩
[Django] DRF 특강 2,3일차 기본 개념 정리 본문
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 |