REST & GraphQL API of the Airbnb Clone using Django REST Framework and Graphene GraphQL
- List Rooms
- Filter Rooms
- Search By Coords
- Login
- Create Account
- See Room
- Add Room to Favourites
- See Favs
- See Profile
- Edit Profile
- 노마드에서 블루프린트 클론
- 원하는 디렉토리에서 git clone https://github.com/nomadcoders/airbnb-api --branch blueprint --single-branch new-airbnb-api
- 깃허브에서 새로운 레포를 만들고 클론한걸 옮겨야함
- 디렉토리에서 rm -rf .git
- git init
- git remote add origin 새로운 레포 주소
- git add .
- git commit -m "init"
- git push origin master
- pipenv install
- python manage.py makemigrations
- python manage.py migrate
- python manage.py createsuperuser
- pipenv update django-seed
- python manage.py mega_seed
- REST와 GraphQL api를 섞어서 사용할것임, 근데 원래 섞어서 쓰진 않음
- REST api 가 더 좋다, django rest framework가 있어서
- Graph QL은 node.js랑 잘어울림
- REST api는 서버와 서로 의사 소통을 하는 URL을 사용하는 api
- yts.lt 사이트 api 참고, url마다 제공받는게 다 다름
- 무언가를 요청할때는 GET 요청을함
- 로그인할때 비밀스러운 form을 이용해서 보낼때는 POST
- REST API DESIGN
- api에서 동사들을 사용하지 말자 ex) list_movie -> 나쁨
- 명사는 좋고
- 복수형은 더 좋음
- getAllMoviews,addMovies,deleteMovies -> 이런건 나쁜거다
- CRUD
- Create - Post
- Read - Get
- Update - Put
- Delete - Delete
- /movies/ -> Collection
- /movies/the-godfather -> Elements
- Formula : Collections + Elemetns + HTTP Verbs
- "?"를 사용한다
- /movies?status=now_showing
- collection을 사용하면서 ?를 이용해 쿼리인자를 사용하면 됨
- Version & Pages
- /v1/movies
- HTTP
- 200 ok
- 201 created
- 400 bad request
- 403 forbidden
- 404 not found
- 500 interner server error
- 501 not implemented
- pipenv install djangorestframework
- config/settings 에 third party app 추가
- THIRD_PARTY_APPS = ["rest_framework",]
- Serializer는 기본적으로 데이터가 보여야하는 방식을 설명해줘야 하는 form이다.
- 대신 json 방식이어야함
- 모델들의 객체를 검증해서 json으로 변경해줌
- 즉 파이썬 객체에서 JSON 객체로 바꿔주는것을 의미한다.
- Pagination을 사용하기 위해 setting.py 에 추가
- REST_FRAMEWORK = { "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination", "PAGE_SIZE": 10, }
- ListRooms
- [v] SeeRoom
- viewsets를 사용하면 뭐 아무것도 없이 전부다 가능해짐
- 패지네이션이나 post,get,delete,put 전부
- 근데 아무나 막 수정할수 있으면 안되니 약간의 논리가 필요
- ListRooms
- SeeRoom
- post인지 put의 차이는 put에는 instance값이 있음
- instanace가 first arguement면 serializer가 create이 아닌 put하고 있다고 인식
- serializer의 모든 데이터를 수정할 필요없이 몇개만 수정하고싶으면 partial=True, 안그러면 시리얼라이저의 모든 모델값들에 대해 데이터가 주어져야함
- JWT 는 유저에게 긴 스트링을 주고 유저가 해독함
- 스트링을 가져옴 유저아이디든 이메일이든
- 이걸 인코딩해서 이상한 값으로 바꿈 (토큰)
- 유저는 인코딩된걸 다시 우리한테주고
- 우리는 그걸 다시 디코딩
- 파이썬 JWT 은 설치해야함 pyJWT
- pipenv install pyjwt
- 절대 jwt에 민감한 개인정보를 담아선 안됨 누구나 토큰 해독을 할 수 있음
- 그럼 뭐하러 쓰냐?
- 누가 우리 토큰을 건들엇냐 안건드렷냐 이걸 확인하기 위해 씀
- sns처럼 만약에 유저에 따라서 좋아요 눌럿는지 안눌렀는지를 알려면
- 다이나믹 필드를 사용하면됨
- 만약 is_fav 를 사용한다면
- is_fav = serializers.SerializerMethodField()
- get is*fav 라는 함수를 만들어야함 'get_' 을 붙히면 장고가 알아서 붙음
- def get_is_fav(self,obj): print(obj) return True
- 씨리얼라이저를 통해 어떤 유저가 지금 이 방을 보고있는지를 확인해야함
- request 덕분에 누가 보고잇는지 알 수 있음 . request.user와 context를 통해
- viewsets를 사용하면 url을 라우터가 알아서 만들어줌
- 근데 만약에 room/serch url은 어카냐면
- viesets extra를 보면댐
- 대신 action detail = true 면 /rooms/1 에 적용
- detail false 면 /rooms에 적용
- action 의 함수 이름이 url로 자동 추가됨
- Permission을 overwirte 할때 has_permission 과 has_object_permission 이 있음
- 둘중에 뭐쓸지 잘 생각하셈
- 프로젝트 내에 모든 마이그레이션 파일 제거
- init.py를 제외한 모든것을 제거
- find . -path "/migrations/.py" -not -name "init.py" -delete
- find . -path "/migrations/.pyc" -delete
- 초기화후 스키마 생성
- python manage.py makemigrations
- python manage.py migrate