# pagination 기능 추가하기
pagination 추가하기~
DRF에 내장된 함수를 사용하면 된다.
default로 적용해서 모든 함수에 사용할 수도 있고, pagination을 하고 싶은 개별함수에만 작성할 수도 있다.
아직 정해지지 않아서 둘다 미리 작성해둔다.
# default
# settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAZE_SIZE' : 3
}
settings에 이렇게 설정해두면 모두 적용된다.
'PAGE_SIZE' 변수는 페이지 당 최대 보여줄 데이터의 개수!
LimitoffsetPagination 함수는 파라미터로 limit값과 offset값을 줄 수 있다.
limit는 페이지당 보여줄 데이터의 갯수(PAGE_SIZE와 동일), offset은 데이터의 시작 위치..?라고 한다.
이해가 안됨.
총 6개의 댓글이 있다.(count값은 총 댓글 수)
limit 파라미터를 3으로 하면 3개의 댓글만 보인다. offset은 default=0이다.(index 0부터 시작)
limit=3, offset=2로 할 경우 2 index 데이터(실제로는 3번째)부터 3개의 데이터를 가져오는 것이다.
next와 previous도 알맞게 알려준다.
데이터가 없으면 next/previous url은 null값이다.
근데 PAGE_SIZE가 적용이 안되네!
개별 함수마다 지정해주자.
# 개별(ModelViewSet)
# views.py
from rest_framework.pagination import PageNumberPagination
# Create your views here.
# pagination을 위한 함수
class LargeResultsSetPagination(PageNumberPagination):
page_size = 6
page_size_query_param = 'page_size'
max_page_size = 10000
class PostViewSet(viewsets.ModelViewSet):
queryset=Post.objects.all()
serializer_class=PostSerializer
# filter_backends = [filters.SearchFilter] 검색 기능 미정
# search_fields = ['content', 'user__nickname']
permission_classes = [IsAuthenticated, AuthenticatedOnly]
pagination_class = LargeResultsSetPagination
def perform_create(self, serializer):
serializer.save(author = self.request.user)
Page 파라미터만 필요한 PageNumberPagination 함수를 import한 후 상속받아 커스텀 페이지네이션 함수를 만든다.
page_size에 내가 페이지 당 받아오고 싶은 데이터의 갯수를 입력한 후 pagination_class로 사용하면 된다.
참고로 settings.py보다 여기에 입력한 함수가 더 강하게 적용된다.
page당 6개만 보이고, 마지막 페이지에는 남은 데이터만 보인다.
데이터가 없으면 오류 남.
# 개별(APIView)
APIView는 ModelViewset처럼 자동으로 pagination 안해준다. 따라서 다르게 설정해주어야 한다!
https://velog.io/@chaeri93/Django-DRF-Pagination-APIView
위 코드를 참조했다.
pagination.py의 코드를 잘 이해하고 싶지만...아직 어렵다.ㅜ
아무튼 잘된당
이제 저중에서 원하는 방식을 선택해 페이지네이션 해주자!
# 배포 준비
배포 하기 전 설정하기
- CORS 오류 해결 : 최초 서비스된 내 도메인이 아닌 다른 도메인(예를 들어 프론트)에서 오는 요청을 허용
- pip install django-cors-headers
- settings.py INSTALLED_APPS에 'corsheaders', 추가(가능한 위에)
- settings.py MIDDLEWARE에 'corsheaders.middleware.CorsMiddleware', 추가(가능한 위에)
-
CORS_ORIGIN_ALLOW_ALL = True # 모든 도메인 허용 # CORS_ORIGIN_WHITELIST = ['http://127.0.0.1:3000','허용할 도메인 입력'] CORS_ALLOW_CREDENTIALS = True # 쿠키 허용
- gunicorn 설치 : 동적인 요청 처리를 위함.
- pip install gunicorn
- 배포를 위한 docker 파일 및 requirements.txt 파일 생성
- pip freeze > requirements.txt
AWS 배포(1) - Django, Nginx, Gunicorn (tistory.com)
옛날에 정리한거 참고하기~
이제 로컬에서 Docker를 실행해보자.
docker-compose -f docker-compose.yml up --build
이전에 docker를 이용한 경험이 있다면, 이름이 비슷한 Image나 volume은 삭제해주자. 전에 오류 찾느라 고생했다.
닫을 때는 docker-compose -f docker-compose.yml up down(-d 옵션을 추가한 경우) 혹은 crtl + c
참고로 docker에서 사용하는 database는 local과 다르다. docker-compose.yml 파일에 명시된 database를 사용한다.
version: '3'
services:
db:
container_name: db
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_HOST: '%'
MYSQL_ROOT_PASSWORD: mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --skip-character-set-client-handshake
expose:
- 3306
ports:
- "3307:3306"
env_file:
- .env
volumes:
- dbdata:/var/lib/mysql
web:
container_name: web
build: .
command: sh -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
environment:
MYSQL_ROOT_PASSWORD: mysql
DATABASE_NAME: mysql
DATABASE_USER: 'root'
DATABASE_PASSWORD: mysql
DATABASE_PORT: 3306
DATABASE_HOST: db
DJANGO_SETTINGS_MODULE: dislodged_project.settings.dev
restart: always
ports:
- "8000:8000"
volumes:
- .:/app
depends_on:
- db
volumes:
app:
dbdata:
command를 추가해 mysql 한글 설정 완료!
만약 이 mysql database를 건드리고 싶다면 cmd에 docker exec -it <db container이름> bash 입력 후
mysql 로그인을 하자.
docker가 잘 돌아가면 배포 준비 성공이다.
# 회고
오류가 정말정말 많았다.
왜 생기는지도 모르는 오류가...
따로 정리해야지.
'졸업 프로젝트' 카테고리의 다른 글
cors + 기능 수정하기 (0) | 2024.02.29 |
---|---|
카테고리 기능 + 배포 (0) | 2024.02.18 |
게시판 댓글 기능 (0) | 2024.02.03 |
게시판 기능 (0) | 2024.02.02 |
[Django] Direct assignment to the forward side of a many-to-many set is prohibited. Use groups.set() instead. (0) | 2024.01.31 |