본문 바로가기

졸업 프로젝트

pagination 추가하기 + 배포 준비

# 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

 

[Django] DRF-Pagination APIView

지난 포스트에서는 viewset에서의 pagination을 소개했었다. 그러나 프로젝트를 진행하다 보면서 viewset을 사용하지 않고 커스텀하기 쉬운 APIview를 통해서 뷰를 짰다. 따라서 APIview에서는 다르게 pagina

velog.io

위 코드를 참조했다.

pagination.py의 코드를 잘 이해하고 싶지만...아직 어렵다.ㅜ

아무튼 잘된당

 

 

이제 저중에서 원하는 방식을 선택해 페이지네이션 해주자!


# 배포 준비

 

배포 하기 전 설정하기

  1. CORS 오류 해결 : 최초 서비스된 내 도메인이 아닌 다른 도메인(예를 들어 프론트)에서 오는 요청을 허용
    1. pip install django-cors-headers
    2. settings.py INSTALLED_APPS에 'corsheaders', 추가(가능한 위에)
    3. settings.py MIDDLEWARE에 'corsheaders.middleware.CorsMiddleware', 추가(가능한 위에)
    4. CORS_ORIGIN_ALLOW_ALL = True # 모든 도메인 허용
      # CORS_ORIGIN_WHITELIST = ['http://127.0.0.1:3000','허용할 도메인 입력']
      CORS_ALLOW_CREDENTIALS = True # 쿠키 허용
       
  2. gunicorn 설치 : 동적인 요청 처리를 위함.
    1. pip install gunicorn
  3. 배포를 위한 docker 파일 및 requirements.txt 파일 생성
    1. pip freeze > requirements.txt

AWS 배포(1) - Django, Nginx, Gunicorn (tistory.com)

 

AWS 배포(1) - Django, Nginx, Gunicorn

기본정리 나보다 잘 정리한 사람도 많고...그냥 이해한대로 최대한 정리해봤다. # 배포 아키텍처 WSGI(Web Server Gateway Interface) : Application Server를 호출하여 동적인 요청을 처리할 수 있는 서버 python

jain5379.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가 잘 돌아가면 배포 준비 성공이다.

 


# 회고

 

오류가 정말정말 많았다.

왜 생기는지도 모르는 오류가...

따로 정리해야지.