DRF란 Django에서 지원하는 RESTful API 라이브러리를 말한다.REST란 REpresentational State Transfer 의 약자로 자원의 이름으로 서버와 클라이언트가 통신하는 방법을 말한다.RESTful API가 급부상한 가장 큰 원인은 웹 브라
DRF 4종류의 View 를 알아보기전에 앞서 DRF에서의 계정 관리부터 알아보겠다.왜냐하면 어떤 프로젝트던 계정 시스템이 먼저 구축되어야 만들기 편하기 때문이다.DRF에서는 계정 관리를 위해 dj_rest_auth 와 django-allauth 이 두개의 라이브러리
CORS란 직역하면 교차 출처 리소스 공유로, 간단히 말해서 출처가 다른 리소스를 허용하는 정책이다.원래 웹페이지는 SOP라는 동일 출처 리소스 공유라는 정책을 사용했는데 시대의 흐름에 따라 출처가 다른 리소스를 가져와서 사용하는 일이 늘어났고이에 CORS라는 예외를
Django에서 view를 작성하는 패턴은 두가지가 있다.1\. CBV (Class Based View)2\. FBV (Function Based View)클래스와 함수를 사용하여 구현하는 것인데 이 패턴은 DRF에서도 그대로 적용된다.그러나 어떤 것이 더 좋은 방법인
기존 APIView에서는 각각의 메소드를 모두 작성해야해서 중복 코드가 길어지는 문제가 있었는데이를 개선하고자 나온 것이 Mixins 이다.바로 코드를 보자.형태는 비슷하지만 각각의 메소드에서 작성해야할 코드의 분량이 APIView 에 비해 상당히 줄었다.이는 우리가
CORS = 교차 출처 리소스 공유 (Cross-origin resource sharing)출처: https://ko.javascript.info/url서로 Origin이 같은 경우만 허용위의 그림처럼 origin => 기본적인 주소라고 볼 수 있다.port
https://www.django-rest-framework.org/api-guide/format-suffixes/
https://www.django-rest-framework.org/api-guide/routers/DRF에서 Router는 DefaultRouter, SimpleRouter 두가지가 존재한다Router은 기본적으로 GET, POST / GET, PUT, DE
accounts 과 비슷하게 model, serializers, views 를 구성해주면 된다.모델은 django와 큰 차이는 없다serializers에는 모델의 필드를 용도에 따라 다르게 작성해야함ReadOnlyFieldserializers에서 정의하는 읽기만 하는
구글 소셜로그인 복습중에 TypeError: string indices must be integers 라는 에러가 발생하였다.인덱스에 정수형을 넣지 않아서 발생하는 오류인데똑같이 코드를 작성했음에도 배포사이트에선 오류가 없던 것이 새로 코드를 작성하니 오류가 발생한다.
settins.py 에 해당 설정을 하면 프로젝트 전역에 대한 권한 정책이 설정된다.만약 해당 설정을 지정하지 않으면 기본적으로 rest_framework.permissions.AllowAny (누구나 허용)이다. permission_classes = \[I
django-allauth는 django에서 인기있는 인증패키지 중 하나이다.인증, 등록, 계정 관리 및 소셜 계정 인증 등을 처리한다.그러나 DRF와 함께 사용할 수 있는 기본 기능을 제공하지 않는다.즉 Django를 통한 (소셜)인증을 위한 패키지이나, REST A
12월에 dj-rest-auth 로 프로젝트를 진행했었는데 불과 3개월이 안되서 기존 코드가 작동하지 않았다.프로젝트 당시에는 2.2.5버전을 사용했는데 최신 버전은 3.0.0이였다.변경된 점은 아래와 같다.settings.py 에서 dj-rest-auth 관련 설정
보안을 위해 refresh token을 http only 쿠키로 만들기 위해 다양하게 시도해보고 있다.https://velog.io/@mechauk418/DRF-dj-rest-auth-JWT-%EC%84%B8%ED%8C%85-%EA%B4%80%EB%A0%A8-
게시판 구현에서 페이지네이션은 필수이다. (무한 스크롤도 페이지네이션을 기반으로 한다)페이지네이션 처리전에는 그림처럼 모든 목록이 나온다.DRF는 페이지네이션을 지원해서 간단하게 설정할 수 있다.페이지네이션 후에 api를 확인하면 데이터가 5개씩 잘려있고 URL에서 ?
기존에는 서버측에 로그아웃 요청을 보내는 것이 필요한가? 라는 생각을 했다.로그인을 할때는 반드시 서버로 요청을 보내서 토큰을 얻어야하지만 로그아웃은 클라이언트에서 토큰만 지워주면 된다고 생각했다.그런데 refresh token을 http only 쿠키로 설정하니 클라
조회수는 간단하게 구현하려고 하면 게시글 상세보기 요청할때마다 +1 하는 방식으로 간단하게 구현 가능하지만, 이런 방식은 한명이 조회수를 여러번 올리는 행위가 가능하다.그렇기 때문에 쿠키나 IP 등을 활용하여 중복 조회 방지를 통해 좀 더 유사한 조회수를 구현할 수 있
Nested Serializer 는 Serializer를 중첩시키는 것을 말한다.Serializer을 중첩시키는 이유는 서로 다른 DB에 있는 데이터를 하나로 묶어서 응답하거나, 1:N 데이터를 표현하기 위해서이다.위에서 정의한 Serializer을 CatetagSer
참고 : [Django rest framework 다중 이미지 업로드 방법 ](https://donis-note.medium.com/django-rest-framework-%EB%8B%A4%EC%A4%91-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%9
일반적인 웹페이지에서 이미지는 용량의 큰 비중을 차지한다.용량이 큰 이미지파일은 DB 공간도 많이 먹고, 서비스 이용자에게 불쾌한 로딩을 경험시킨다.비트윈에서 서버 비용을 70%나 줄인 온디맨드 리사이징 이야기위 글은 커플을 위한 어플인 비트윈에서 리사이즈로 서버 비용
DRF에서 모든 인증과정은 아래 3개의 패키지를 기반으로 하므로 설치해주자.이 포스팅은 아래의 블로그 글을 기반으로 했다.Django-Rest-Framework(DRF)로 소셜 로그인 API 구현해보기(Google, KaKao, Github)DRF로 소셜로그인을 구현하
\[DRF] 카카오 소셜 로그인 구현하기 (JWT), 쿠키 설정 및 주의사항 (CORS관련)전체적인 코드는 카카오 로그인에서 사용한 것과 비슷하다.카카오와 아주 조금 다른게 있다면 state 라는 랜덤한 문자열이 필요하다.이 state는 csrf 공격을 방지하기 위한
SameSite 는 쿠키 속성이다.문자 그대로 같은 사이트라는 의미로 쿠키를 같은 사이트에서만 주고 받을지, 다른 사이트에서도 주고 받을지를 정하는 속성이다.CORS 쿠키버전이라고 생각하면 된다.SameSite 정책은 크게 3가지가 있다.NoneStrictLaxSame
AWS EB와 Github actions 을 활용해서 Django로 만든 사이트를 배포하고자 한다.https://aws.amazon.com/ko < 요기로 접속하자.위의 AWS 링크로 접속했으면 IAM 으로 들어가자.IAM 은 계정 권한 관리하는 그런 시
S3가 파일을 저장하는 스토리지라면 RDS는 데이터를 저장하는 데이터베이스서비스이다.PostgreSQL은 Oracle DB, MySQL, Microsoft SQL같은 데이터베이스 서비스의 일종으로 개발자가 선호하는 SQL이다. RDS는 다양한 SQL을 지원하지만 여기서
참고로 Elastic Beanstalk는 기본적으로 http이다.그런데 요즘 대부분의 웹사이트는 https를 권장하고, 프론트와 백엔드가 https를 통일하지 않으면 통신이 불가능하기 때문에 https로 바꾸는 작업이 필요하다.https로 바꾸고 도메인을 지정하기 위해
프로젝트 중간에 파이썬 버전을 변경할 일이 생겼다.윈도우에서 파이썬 버전을 변경하고 프로젝트에서 git bash를 조작하면 No python at \~~ 라고 뜬다.이럴땐 아래의 venv - pyvenv.cfg 에서 home의 경로를 새로 설치한 파이썬 위치로 변경해주
스로틀링은 보통 전자기기에서 기기의 수명이나 안정성을 위해 성능을 의도적으로 제한하는 행위이다.DRF에서 스로틀링도 비슷한 개념이다.시스템으로 오는 요청의 수가 과도하게 많을 경우 시스템 전체에 부하가 걸리므로 이를 방지하기 위해 요청 수를 의도적으로 제한하는 것을 스
필터링은 쿼리에서 반환되는 항목을 조건부로 제한하는 것을 말한다.가장 간단한 필터링은 GenericAPIView 에서 .get_queryset()를 오버라이딩하여 직접 필터링 하는 것이다.목록에서 팀명이 다래인 자료만 보고 싶다면 위처럼 직접 필터링하여 작성할 수 있다
Swagger 은 개발한 Rest API를 편리하게 문서화해주고, 이 문서를 보고 사용자가 API를 호출, 테스트할 수 있게 도와주는 도구이다.물론 DRF가 엔드포인트를 html로 제공해서 거기서도 테스트를 할 수 있지만, 프로젝트 전체를 한눈에 보고 테스트를 할 수
DRF 필터링해당 포스팅에서 DRF의 필터링 기능에 대해 알아보았다.그런데 보통 커뮤니티에는 특정 필드를 검색하는 기능이 있다.그렇다면 이러한 기능을 구현하기 위해서는 어떻게 해야될까?우선 필드별로 필터링해주는 filterset_fields 과 검색 필터링을 제공하는
게시판의 추천 글 모아보는 기능을 구현해보고 싶었다.모델은 이렇게 구성되어있다.추천수를 api에서 제공하기 위해 serializers.py 에서 아래와 같이 구현했다.그러나 serializer에서 만든 추천수로는 filter을 사용할 수 없었다.그래서 view에서 an
예를 들어서 특정 인스턴스를 삭제하려고할때, 조건을 통과하지 못한 인스턴스는 삭제가 불가능하게 하려고 한다.이런 경우에 destory 를 오버라이드해서 커스텀해야하는데 요청에서 데이터를 끌어와야 한다.이런 경우에는 get_object() 를 활용할 수 있다.
ModelViewSet를 오버라이딩해서 사용할때 request 데이터로 코드를 작성해야 하는 경우가 있다.예를 들어 아래와 같은 perform_update를 오버라이딩한다고 할때self.request.data\['데이터명']여기서 응답 데이터를 가져올 수 있다.
django의 datetime 인스턴스는 시간대(tz)를 가질 수도 있고, 안가질 수도 있다.만약 시간대를 가진다면 aware 속성, 안가진다면 naive 속성으로 분류한다.서로 다른 속성끼리는 시간의 연산이 불가능하다.보통은 시간대를 가지지 않는 naive보다는 aw
DRF에서는 APIview가 csrf 검증을 제외해주지만 django에서는 그렇지 않다.get을 제외한 모든 요청에 자동으로 csrf 검증이 포함되는데함수 데코레이터를 통해 csrf 검증에 예외를 둘 수 있다.
settings.py 에서 URL 끝에 / 를 넣지 않는다. (django 특징)실행이 오래 걸리는 코드는 넣지 않는다. (API 수집으로 20분 정도 걸리는 코드를 서버 시작하면서 실행하고 싶었으나 배포가 되지 않았다.)
항상 모델을 추가할때, 기존 데이터들에 값을 채워넣는 문제로 인해서 null=True, blank=True 를 모델옵션으로 설정해주는데 정확하게 이 두 옵션의 차이가 궁금했다.null=True는 DB에서의 null 값을 허용한다는 것이다. 즉 DB에 null이 올 수
RDS 연결 후에 DB를 수정하는 방법에는 여러가지가 있다.첫번째로는 장고 ORM을 활용하는 것이다.모델에서 name 필드가 '코드' 인 항목들의 value 필드를 10으로 일괄 변경해준다.두번째로는 SQL에서 쿼리문을 작성하거나 해당 RDBMS의 프로그램을 활용하는
이러한 ModelViewSet에서 list를 오버라이드했는데 그 전에는 잘 적용되던 페이지네이션이 깨졌다.정확한 원인은 찾지 못했지만 아래의 답변을 보면 상속 과정으로 인해 발생하는 문제라고 추측된다.https://stackoverflow.com/questio
JSON의 단점을 보완하기 위해 나옴따라서, JSON -> YML 변환은 자유롭다.key: value 로 구성되어있다.: 다음에는 반드시 공백문자가 온다.| 는 줄바꿈, > 는 줄바꿈 무시배열은 아래와 같이 표현한다.
Django ORM에서 GROUP BY를 하려면 annotate 와 values를 사용한다.여기서 values('keyword') 는 GROUP BY로 묶을 컬럼을 지정해주고annotate 는 위에서 묶은 집단에서의 집계함수를 새로 생성하는 개념이라고 생각할 수 있다.
cast 는 컬럼의 타입을 변경시켜준다.용도: 계산을 위해 쓴다.F() 는 모델의 필드, 혹은 어노테이트 된 값을 말한다.이처럼 앞에서 annotate로 선언한 가상의 컬럼을 가져오기 위해 사용한다.F()를 계산해줌
한 기업에서 내준 사전과제를 하다가 테스트코드를 알게 되었다.django로 프로젝트를 시작하면 보통 앱과 같은 폴더에 tests.py로 생성되지만여기 한 파일에 모든 테스트코드를 담기 어려우면 아래와 같이 폴더에서 나누어도 똑같이 동작한다.DRF 테스트에서는 구현한 앱
기존에 사용했던 DRF의 PageNumberPagination 는 Offset 방식의 페이지네이션이다.Offset 방식이란 SQL로 표현하면 아래와 같다.WHERE 을 활용하여 특정 지점(커서)를 불러오고 그 이후로 쿼리를 반환하는 방식이다.그렇기 때문에 해당 방식을
소셜로그인 개발중에 site matching query does not exist 라는 에러가 발생했다.찾아보니 django site 프레임워크를 사용할때 발생하는 에러였다.django는 DB에 여러 웹사이트를 등록하고 주소를 변경해가면서 사용할 수 있다.setting
django test를 작성할때는 APITestCase의 client에서 요청을 보내는데, 이 방식이 평소에 사용하던 requests와는 조금 다르다.header 앞에 \*\* 을 붙여야하며, header의 key 값에는 HTTP\_가 붙어야 한다.즉, {"AUTHOR
setUp 때문에 기존 코드와는 다른점이 있어 주의사항을 작성한다.이런 식의 테스트 코드가 있다고 가정하자.setup에서 로그인만 하고 test_create_aritcle에서 글 작성하는 것을 테스트, test_update_aritcle에서 글 수정하는 것을 테스트하는
메인 도메인을 같게 하고 서브도메인으로 백엔드와 프론트엔드를 구분했다.이렇게 하는 이유는 쿠키를 공유하기위함이다. 예를 들어 백엔드가 api.example.com, 프론트엔드가 www.example.com이라면 쿠키의 도메인을 .example.com 으로 한다면 백엔드
트랜잭션이란 DB에서 상태를 변화시키기 위해서 수행하는 작업의 단위를 말한다.DB의 상태를 변화시킨다는건 SELECT, INSERT, DELETE, UPDATE 같은 쿼리 명령어를 사용한다는 것인데, 작업의 단위라고해서 해당 명령어를 사용하는 쿼리 한줄을 의미하는 것은
Django ORM은 Lazy-loading 라는 특징을 가진다.이 Lazy loading는 ORM에서 명령마다 DB에 접근해 데이터를 가져오는 방식이 아니고, 명령 처리가 끝나고 실제 데이터를 불러올때 쿼리문을 실행하는 방식이다.흔히 볼 수 있는 위 코드에서 db는
개요 django ORM에서 경쟁 상태 (Race condition)에 대해 알아본다. 경쟁 상태란? 경쟁 상태 (Race condition)는 멀티스레드 환경에서 스레드가 공유자원에 접근할때, 순서에 따라 데이터를 잘못 가져와 결과값이 달라지는 현상을 말한다.
atomic() 에 대해 알아본다.django는 기본적으로 auto commit이다.이러한 코드가 있다고 해보자.read_count 는 int 이므로 당연히 문자열을 더하는 작업은 오류가 발생한다.그러나 해당 함수를 실행하면 오류가 발생하기 직전인 post.read_c
개요 django의 transaction 메서드에 대해 학습한다. commit(using=None)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "새로운프로젝트명.settings")ROOT_URLCONF = '새로운프로젝트명.urls'WSGI_APPLICATION = '새로운프로젝트명.wsgi.application'os.env
클라이언트의 실제 IP를 가져온다.\[Nginx] proxy_set_header X-Forwarded-For, X-real-IP해당 설명을 보면 이해하기 쉽다.다른 경로를 경유해서 XFF가 존재한다면 XFF의 첫번째 IP를 가져오고 아니면 REMOTE_ADDR의 IP를
static static file이란 말 그대로 정적 파일이다. css, js, image 등 변하지 않고 미리 준비해야하는 파일을 말한다. STATICFILES_DIRS : 개발 단계에서 사용하는 정적 파일이 위치한 경로를 지정한다. 만약 여러 앱에서 서로 다