django(11)
-
[Error] ModuleNotFoundError: No module named 'apps.views.main'; 'apps.views' is not a package
문제 발생 원래 Django에서는 app 디렉토리 내의 views.py 파일에 뷰 함수나 클래스를 작성한다. 하지만 나 같은 경우 views.py 파일이 복잡해져 파일로 분리해 작성하고 싶었다. 이 오류는 분리한 파일을 폴더로 생성하고 폴더 내부에 파일들을 생성해 다른 파일에서 해당 뷰를 import 할 때 난 오류이다. 원인 기존의 views.py 파일과 새로 생성한 디렉토리 이름 간의 이름 충돌이 발생한 것이다. 예를 들어, 기존의 views.py 파일과 myapp/views 디렉토리에 새로 생성한 main.py 파일이 존재하는 경우, from . import views와 같은 import 구문이 views 파일인지 views 폴더인지 어떤 것을 참조해야 하는지 알 수 없기 때문에, ModuleNot..
2023.04.27 -
[DRF] Custom Permission- URL based permission
URL-based permission URL 패턴에 따라 사용자에게 다른 권한을 부여하는 방식을 의미한다. URL dispatcher Django는 일반적으로 URLconf 파일을 가지고 있다. URLconf 파일은 각 app단의 urls.py 모듈에서 정의된다. 이 파일에는 urlpatterns 변수를 정의하고, 이 변수는 URL 패턴을 리스트로 나타내며, 각 패턴은 path() 또는 re_path() 함수를 사용하여 정의한다. Django는 URLconf 파일에 URL 패턴을 정의하고 각 패턴에 대해 어떤 view 함수나 클래스를 호출할지를 지정해 매칭시킨다. URL dispatcher는 HTTP요청이 들어올 때마다 적절한 url에 연결해주는 기능을 의미한다. 이러한 기능을 기반으로 특정 URL 패턴..
2023.04.21 -
[DRF] Custom Permission 생성- BasePermission
permission_classes DRF는 API View에서 요청을 처리하기 전에 실행되는 인증 및 권한 검사를 위해 permission_classes 속성을 제공한다. 보안을 위해 클라이언트의 요청이 특정 권한을 가지고 있는지 확인하는 데 사용되며 APIView 클래스에서 상속받아 사용할 수 있다. 클래스의 종류 DRF는 몇가지 기본 클래스를 제공하고 직접 커스텀 하여 권한 클래스 사용할 수도 있다. AllowAny : 모든 요청에 대해 인증 없이 접근을 허용 IsAuthenticated : 인증된 사용자만 접근을 허용 IsAdminUser : 관리자 권한을 가진 사용자만 접근을 허용 IsAuthenticatedOrReadOnly : 인증된 사용자는 모든 HTTP 메소드를 사용할 수 있지만, 인증되지..
2023.04.19 -
[DRF] Serialization / Deserialization 동작 변경 - to_internal_value와 to_representation
Serialization과 Deserialization Serialization과 Deserialization은 사용자와 클라이언트가 API에서 데이터를 읽고 쓸 수 있도록 API에서 데이터를 표현하고 전송하는 데 사용되는 기능이다. Serialization 직렬화 Serialization은 데이터 객체를 JSON 또는 XML 등의 포맷으로 변환하는 과정으로 DRF에서는 Serializer 클래스를 사용하여 객체를 직렬화할 수 있다. Serializer는 ModelSerializer, Serializer 및 다른 유형의 Serializer 클래스를 포함하는 다양한 유형이 있고 Serializer를 사용하면 모델 인스턴스를 쉽게 JSON, XML 또는 다른 포맷으로 변환할 수 있다. Deserializat..
2023.04.17 -
[Django] ManyToMany 모델 인스턴스 생성 및 삭제하기- add, clear
ManyToManyField Django에서 ManyToManyField란 다대다(N:M) 관계를 나타내는 필드이다. 이 필드를 사용하여 두 개의 모델 사이에 여러 개의 관계를 설정할 수 있습니다. ManyToManyField는 관계의 중간 테이블은 두 모델의 기본키(primary key)를 참조한다. class Author(models.Model): name = models.CharField(max_length=100) books = models.ManyToManyField('Book') class Book(models.Model): title = models.CharField(max_length=200) authors = models.ManyToManyField(Author) 예시 테이블을 하나 가져..
2023.04.14 -
[Django] Django에서 fixture 사용
Fixture 일반적으로 데이터베이스의 초기 데이터나 테스트 데이터를 쉽게 생성하고 로드할 수있게 해주는 도구이다. 데이터베이스에서 내보낸 JSON 또는 XML 형식의 데이터를 이용하여, 다른 데이터베이스에 데이터를 이전하거나, 초기 데이터를 적용하는 데 사용할 수 있다. Dump & Load fixture는 dumpdata와 loaddata 관리 명령을 사용하여 작업할 수 있다. dumpdata 명령은 현재 데이터베이스에서 데이터를 추출하고, loaddata 명령은 이러한 데이터를 사용하여 데이터베이스를 채워준다. dumpdata 현재 데이터베이스에 있는 데이터들을 json형식으로 dump 떠 JSON 파일로 추출할 수 있다. $ python manage.py dumpdata APP_NAME.MODEL..
2023.03.31 -
[Django] JSON WebToken - Simple JWT
JSON WebToken 유저를 인증하고 식별하고 JSON 형식의 데이터를 안전하게 전송하기 위한 토큰 기반의 인증 시스템이다. 특징 세션과 다르게 서버가 아닌 클라이언트에 저장되어 메모리, 스토리지 등 세션을 관리했던 서버의 부담이 줄어든다. 토큰 자체에 데이터가 담겨있어 판별가능하다. 상태를 유지하지 않아 Stateless하다. 인증 방식 유저가 로그인 요청을 한다. 서버 단에서 유저(클라이언트)에게 유일한 토큰을 발급한다. 클라이언트는 서버 측에서 전달받은 토큰을 쿠키나 스토리지에 저장해두고, 서버에 요청할 때마다 해당 토큰을 HTTP 헤더에 포함시켜 전달한다. 서버는 전달받은 토큰을 검증하고 요청에 응답한다 토큰에 요청한 사람의 정보가 담겨있으므로 DB조회 없이 유저 식별이 가능하다. JWT 구조..
2023.03.30 -
[PostgreSQL] Row Level Security
Row Level Security (행 수준 보안) 간단하게 PostgreSQL 데이터 베이스 테이블에 추가적으로 적용가능한 필터라고 볼 수 있다. 테이블 데이터에 접근하거나 수정,삭제와 같은 특정 작업들을 수행할 수 있도록 특정 그룹 사용자에게 권한을 부여하고 요청이 오면 쿼리 조건을 수행 하기 전 가장 먼저 적용되어 특정 정책에 따라 데이터가 축소되거나 엑세스 자체가 거부될 수 있다. RLS 장점 1. RLS를 사용하면 개발자가 동일한 데이터베이스에 여러 테넌트에 대한 데이터를 안전하게 저장할 수 있다. 2. RLS 보안 정책은 쿼리를 실행하는 테넌트에 속하지 않는 행을 필터링해준다. 3. 데이터베이스 내부에 필터 논리를 중앙화하면 유지 관리가 단순해지고 보안 오류 위험이 줄어든다. 동작 예시 Dja..
2023.03.30 -
[Django] Django Middleware
Middleware https://docs.djangoproject.com/en/4.1/topics/http/middleware/ Django의 Request/ Response 처리에 연결되는 프레임 워크로 입출력을 특정한 app단이 아니라 전역적으로 변경하기 위한 가볍고 낮은 수준의 플러그인 시스템이다. Http Request가 들어오면 미들웨어를 거쳐 url에 매핑된 view로 보내고 Response역시 미들웨어를 거친다. Django settings.py 미들웨어간의 유기적인 관계가 설정되어 있기 때문에 등록하는 순서가 중요하다. HTTP Request는 위에서부터 순차적으로 미들웨어가 적용되며 Response를 반환할 때는 아래에서 위로 미들웨어가 적용된다. MIDDLEWARE = [ "djang..
2023.03.16 -
[Django] DRF로 pagination 적용하기 -PageNumberPagination
페이지네이션(Pagination) 구글에 DRF pagination으로 검색을 하면 많은 결과가 한번에 보여지는 것이 아니라 다음과 같이 페이지별로 보여진다. 결과가 약 만개라고 가정했을 때 매번 전체 결과를 가져오면 속도가 굉장히 느리고 유저입장에서는 불편할 것이다. 따라서 전체 데이터에서 지정된 값 만큼 데이터를 나눠서 가져오는 방식을 페이지네이션 이라고 한다. http://127.0.0.1:8000/user/?page=2 DRF에서는 PageNumberPagination, LimitOffsetPagination, CursorPagination 와 같은 페이지네이션 기능을 제공하고 있다. 이 글에서는 실제 사용을 한 PageNumberPagination로 페이지네이션을 적용하는 것에대해서만 작성하려고..
2023.03.16