카테고리 없음

[책] RESTful 파이썬 웹 서비스 제작 - 1 Django rest framework

Jundol 2019. 10. 30. 15:53

이미지출처. 에이콘출판사

 

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

열심히 읽자!