1.phone_number, email중복방지를 view로직에서 짜지 말고,
model에 unique=True로 해결해보자
2.Usermodel에서 USERNAME_FIELD와 REQUIRED_FILEDS를 활용하자.
user.save(using=self._db)
using=self._db는 django에 연결된 db가 여러개일 경우, 디폴트 db를 사용하라는 명령이다.
user모델을 settings에 등록해준다.
AUTH_USER_MODLE = 'appname_usermodelname'
when to use an APIView
-full control over the logic
-processing files and rendering a synchronous response
-calling other APIs/services
-accessing local files or data
features of APIview(get,post,put,patch,delete)
-get,post,patch,put,delete
-similar to a traditional Django view
-gives you the most control over your logic
-is mapped manually to urls
API view example
what are viewsets
-list , create, retrieve, update, partial update, destroy
-takes care a lot of typical logic
-perfect for standar database operations
-fastest way to make a database interface
when to use viewsets?
-need a simple CRUD interface to your db
-want a quick and simple API
-need little to no customization on the logic
-working with standard data structure
features of viewsets
-uses actions(list, create, retrieve, update, partial_update)
-automatically maps to URLs using Routers
-provides more functionality with less code
permission커스텀 할 수 있다. 보통 permissions.py파일 만들고 그 안에서 코드 작성한다.
has_object_permission
메서드가 가장 중요하다.
퍼미션이 사실상 이 메서드를 통해 이루어진다.
request올 때 마다 실행되면서, permission여부를 확인하고, boolean값을 내뱉는다.
SAFE_METHODS는 안전한 메서드, 즉 데이터에 변화를 가하지 않고(=put, patch, delete,post를 하지 않고) 보기만 하는, get메서드에 해당하는 메서드다.
아래 코드는 get 메서드가 오면 허락(True를 반환)하고, 다른 메서드 요청이 오면,
현재 페이지의 id와 유저의 id가 일치하는지 확인한 후 일치하면 허락, 아니면 거절한다.
obj.id는 현재 페이지의 id를 의미한다. (예. detail/1 일 때 1)
위에서 커스텀 한 permission을 뷰에 더해보자.
Tuple을 사용하는 이유는, 한 뷰에 여러permissions, authentication클래스가 지정될 수 있기 때문.
12.search필터 적용하기
먼저 filters를 임포트한다.
from rest_framework import filters
원하는 뷰 클래스에서 아래 코드를 정의한다.
search_fields는 모델에 맞게 설정해준다.
flter_backends = (filters.SearchFilter,)
search_fields = ('name', 'email',)
확인해보자.
url로 들어가보면, filters버튼이 생긴걸 볼 수 있고, 해당 버튼을 클릭하면 아래 처럼 검색기능이 활성화된다.
DefaultRouter()를 쓸 경우,
ModelViewset을 쓴다면 base_name 필요 없고,
그렇지 않다면 base_name을 지정해줘야한다.
ModHeader extension을 통해 header에 token을 실어 인증할 수 있다.
(크롬 익스텐션)
jwt토큰 인증을 통해 현재 로그인한 유저가 누구인지 판별할 때, 여태까지 jwt토큰을 decode하고, 거기서 user_id를 얻어내 user를 찾아냈다.
근데 굳이 그럴 필요가 없다.
permission_class가 IsAuthenticated일 때, request.user를 프린트해보면 지금 request보낸 유저가 누구인지 바로 알아낼 수 있다. 꿀팁
create메서드 사용시, perform_create가 호출되는데, 추가 인스턴스가 있을 때 이 메서드를 오버라이드 할 수 있다.
한 뷰에 permissoin_classes를 두개 지정할 수 있다. 지금 들 예시의 경우 하나는 커스텀버전, 하나는 drf기본 제공