TIL day-62

yo·2020년 9월 14일
0

1.phone_number, email중복방지를 view로직에서 짜지 말고,
model에 unique=True로 해결해보자

2.Usermodel에서 USERNAME_FIELD와 REQUIRED_FILEDS를 활용하자.

  1. user.save(using=self._db)
    using=self._db는 django에 연결된 db가 여러개일 경우, 디폴트 db를 사용하라는 명령이다.

  2. user모델을 settings에 등록해준다.
    AUTH_USER_MODLE = 'appname_usermodelname'

  3. 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

  4. 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

  5. API view example

  6. 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

  7. 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

  8. features of viewsets
    -uses actions(list, create, retrieve, update, partial_update)
    -automatically maps to URLs using Routers
    -provides more functionality with less code

  9. 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버튼이 생긴걸 볼 수 있고, 해당 버튼을 클릭하면 아래 처럼 검색기능이 활성화된다.

  1. DefaultRouter()를 쓸 경우,
    ModelViewset을 쓴다면 base_name 필요 없고,
    그렇지 않다면 base_name을 지정해줘야한다.

  2. ModHeader extension을 통해 header에 token을 실어 인증할 수 있다.
    (크롬 익스텐션)

  3. jwt토큰 인증을 통해 현재 로그인한 유저가 누구인지 판별할 때, 여태까지 jwt토큰을 decode하고, 거기서 user_id를 얻어내 user를 찾아냈다.
    근데 굳이 그럴 필요가 없다.
    permission_class가 IsAuthenticated일 때, request.user를 프린트해보면 지금 request보낸 유저가 누구인지 바로 알아낼 수 있다. 꿀팁

  4. create메서드 사용시, perform_create가 호출되는데, 추가 인스턴스가 있을 때 이 메서드를 오버라이드 할 수 있다.

  5. 한 뷰에 permissoin_classes를 두개 지정할 수 있다. 지금 들 예시의 경우 하나는 커스텀버전, 하나는 drf기본 제공

profile
Never stop asking why

0개의 댓글