[책] RESTful 파이썬 웹 서비스 제작 - 1 Django rest framework
RESTful 파이썬 웹 서비스 제작 책을 읽고있다.
예제를 따라하며 생긴 문제점과 현기준 최신버전의 pip 패키지를 사용했을 때 나타나는 에러들을 정리해봤다.
본 포스트는 1~4장까지인 Django rest framework를 학습하면서 명령어를 포함해 정리해보았다.
# 웹서버 실행
python manage.py runserver
윈도우 파워쉘 사용
cd pythonREST
python -m venv Django02
PythonREST\Django01\Scrlpts\Activate.ps1
가상환경 Activate 시 명령창 맨앞에 (Django01) 활성화됨
# django 설치
pip install django
pip install djangorestframework
# httpie 설치
pip install httpie
cd Django01
django-admin.py startproject gamesapi
cd gamesapi
python manage.py startapp games
# psycopg2 (postgresql 사용에 필요한 도구)
pip install psycopg2
# git 소스파일 복사 후
python manage.py makemigrations games
# 필드 필터링 기능 사용을 위해
pip install django-filter
# 브라우저 API가 다른 필터를 렌더링하는 방법을 향상시키는 패키지
pip install django-crispy-forms
# 단위 테스트 설정
pip install coverage
pip install django-nose
# 종속성 리스트 생성
pip freeze > requirements.txt
get 메서드 실행시 RetrieveUpdateDestroyAPIView 슈퍼클래스에 정의돼 있으며, mixins.RetrieveModelMixin에 정의된 retrieve 메서드를 호출한다.
models.py 에서 unique=True 로 설정시 중복값 저장이 불가능하다.
PATCH메서드를 통해 단일필드 업데이트가 가능하다.
pagination
rest_framework.pagination.LimitOffsetPagination 클래스 사용한다.
pagination 기본 클래스 설정에 최대제한값을 설정하는 부분이 없다.
그러므로 LimitOffsetPagination 을 상속하는 별도의 클래스를 만들어 max_limit=10 이라는 설정을 통해 최대값을 제한해야한다. (안그러면 최대제한값에 제한이 없어 큰일난다…)
권한 인증
rest_framework.authentication.BasicAuthentication # 사용자 이름과 암호에 대한 HTTP 기본 인증을 제공한다.
rest_framework.authentication.SessionAuthentication #장고의 인증을 위한 세션 프레임워크로 작동한다.
스로틀
api get에 제한을 거는 방법이다.
인증되지 않은사용자와 인증된사용자에 각각 차별된 get 제한을 걸 수 있다.
rest_framework.throttling 모듈에서 3개의 스로틀 클래스를 제공한다.
BaseThrottle -> SimpleRateThrottle 클래스의 서브클래스다.
- AnonRateThrottle : 익명사용자가 요청 할 수 있는 요청 비율 제한 (ip 로 걸러짐)
- UserRateThrottle : 특정 사용자가 요청할 수 있는 속도 제한
- ScopedRateThrottle : throttle_scope 속성에 할당된 값으로 식별되는 API의 특정 부분에 대한 요청 비율을 제한한다.
필터
클래스
- django_filters.NumberFilter
- django_filters.DateTimeFilter
lookup_expr 값은 조회(lookup) 표현식 'gte', 'lte' 사용
gte: 크거나 같음 (greator then or equal)
lte: 작거나 같음 (less than or equal)
- django_filters.AllValueFilter
지정문자열과 일치하는 필터 적용
이중 밑줄(__) 은 모델의 필드로 읽거나 두 개의 밑줄을 점 하나로 대체해 읽을 수 있다.
error
ImportError: Could not import 'rest_framework.filters.DjangoFilterBackend' for API setting 'DEFAULT_FILTER_BACKENDS'. ImportError: Module "rest_framework.filters" does not define a "DjangoFilterBackend" attribute/class.
중요)DjangoFilterBackend was deprecated in 3.7
Removed DjangoFilterBackend inline with deprecation policy. Use django_filters.rest_framework.FilterSet and/or django_filters.rest_framework.DjangoFilterBackend instead
settings.py
REST_FRAMEWORK > DEFAULT_FILTER_BACKENDS > rest_framework.filters.DjangoFilterBackend
use) django_filters.rest_framework.DjangoFilterBackend
error
AttributeError: module 'rest_framework.filters' has no attribute 'FilterSet'
views.py
from rest_framework import filters
use) django_filters.rest_framework import FilterSet
error
TemplateDoesNotExist at /player-scores/
django_filters/rest_framework/crispy_form.html
django rest framework 에서 cripsy_form 을 사용하기 위해서는 INSTALLED_APPS 에 django_filters 를 추가해줘야한다.
error
filter_class 속성은 DRF 되었다. filterset_class 로 대체한다.
아래 명령어를 통해 종속성이 있는 패키지 리스트를 txt 파일로 export 해놓을 수 있다.
배포를 하기위해서는 항상 남겨놓는것이 좋다.
pip freeze > requirements.txt
5장부터는 플라스크를 이용한 API 이다.
열심히 읽자!