반응형

백엔드 Back-end/장고 Django 19

장고 어드민 무료 테마 Unfold 추천!

기본 장고 어드민 기본 장고 어드민은 예쁘지 않다. 이렇게 생겼다. 모서리도 다 직각이다. 너무 딱딱한 느낌이다. django-unfold Unfold 테마를 적용한 결과다. 기본 장고 어드민 형태를 유지하면서 세련되게 변경된 것을 볼 수 있다. 장고를 웹사이트로 변경해주는 무료 테마도 보이지만, 웹사이트로 쓰는 용도가 아니라 사내 어드민 용도라면 Unfold 테마로도 충분한 거 같다. unfold 적용 시 주의사항 장고 어드민 모델 추가 시 from unfold.admin import ModelAdmin 이용할 것! 기존 장고 from django.contrib.admin import ModelAdmin을 이용하면 안 된다. 그러면 예쁘지 않게 나타난다. 이렇게 보인다. User, Group 등 기본으..

Q. 장고Django에서 테스트 코드 작성 시 개발팀 내 관습convention으로 정해야 할 사항들은?

A. 테스트 팩키지, 테스트 파일의 위치, 테스트 파일명, 테스트 클래스명, 테스트 메소드명, 테스트 함수명, 테스트 코드 작성 방식 등을 미리 정해두는 게 좋다. 미리 정하지 않으면 각자 방식대로 하게 되고, 추후 유지보수가 어렵다. 처음 시작할 때 각자 테스트를 해보고 의견을 취합해서 정하는 것이 좋다. 한번 정하면 바꾸기 쉽지 않고, 기존 테스트 코드가 있기 때문에 관성에 따라 정한 방식대로 작성하게 되기 때문이다. 테스트 팩키지pytest: 파이썬 계열 대표 테스트 팩키지. pytest 없이도 django에서 기본 제공하는 django.test로 테스트 가능하다. pytest를 사용할지 말지 논의가 필요하다. pytest-django: pytest를 활용하면서 장고django 테스트할 때 쓰는 팩..

Q. 장고 어드민Django admin에서 큰 크기의 csv 또는 엑셀 파일 내려받기를 구현할 수 있을까?

A. celery를 활용해 비동기 처리하면 구현할 수 있다. 장고 어드민 사이트The Django admin site란? 장고에서 기본 제공해주는 관리자 화면이다. 웹페이지가 기본 구현되어 있어서 몇가지 어드민 관련 설정만 해주면 되어서 편하다. 아래 예가 그 예이다. 사용자 등 장고 모델과 연관되어 데이터 추가 삭제 수정을 아주 쉽게 관리할 수 있다. 초기 스타트업에서 장고로 서비스를 구현했을 때 보통 백오피스(back office)라고 많이 부르는 내부 직원용 페이지를 굳이 따로 만들지 않고 장고 어드민을 많이 활용한다. 큰 크기의 csv나 엑셀 파일을 내려받는 경우와 관련 이슈 데이터베이스 접근은 백엔드 개발자 등 일부만 가능하다. 따라서 분석 등을 위해서 데이터를 csv 파일이나 엑셀 파일로 받을..

Q. 장고Django에서 같은 이름으로 인덱스index를 추가할 수 있을까?

A. 장고 2.2.x 버전에서는 추가할 수 있고, 장고 3.2.x 버전에서는 추가할 수 없다. 장고 버전 3.2.x에서 인덱스 name을 같은 이름으로 하면 유일한 이름이 아니라고 makemigrations에서 에러가 발생한다. 사례 예제 코드 DRF - CRUD를 활용해서 테스트 해보자. 테스트를 위해서 모델에 아래처럼 인덱스를 추가하자. class Category(models.Model): name = models.CharField(max_length=200) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = "category" ..

Q. 장고Django 쿼리셋Queryset에서 select_related보다 prefetch_related 사용을 권장하는 이유는?

A. 조인 분해를 통해서 성능상에서 이익을 얻는 경우가 많기 때문이다. select_related와 prefetch_related SQL 쿼리 예 Q. 장고Django ORM에서 n+1 이슈란? n+1 이슈 해결 방법은?란 글에서 다뤘듯이 select_related는 INNER JOIN을 사용한다. prefetch_related는 INNER JOIN을 사용하지 않고 조인을 분해한다. 앞의 글에서 다뤘던 예를 다시 가져오면 아래와 같다. select_related SQL 쿼리 예 SELECT `app_beverage`.id, `app_beverage`.name, `app_beverage`.category_id, `app_beverage`.price, `app_beverage`.is_available, `a..

Q. 장고Django ORM에서 n+1 이슈란? n+1 이슈 해결 방법은?

A. n+1 이슈란 목록을 조회할 때 주로 발생하며, 연관된 데이터까지 가져올 때 데이터 개수(n으로 표현)만큼 추가로 데이터베이스를 조회하는 이슈를 뜻한다. 해결 방법은 쿼리셋을 가져올 때 select_related 또는 prefetch_related를 사용하는 것이다. n+1 이슈 예아주 간단히 카페 메뉴 정보를 저장하는 API 서버를 만드는 경우를 생각해보자. (예제 코드: DRF - CRUD) 카테고리 테이블과 음료 테이블 두 개가 있다. 카테고리 테이블에는 커피, 티를 입력했고, 음료에는 카테고리를 커피로 선택해서 아메리카노, 카페 라떼, 에스프레소, 카푸치노를 입력했다. 카테고리 테이블과 음료 테이블 사이의 관계는 카테고리 1개에 여러 음료가 연결될 수 있으니 1 : n(일 대 다) 관계다. ..

Q. 장고Django의 View와 DRF의 APIView의 인증 관련 차이는?

A. CSRF 보호 제외 여부다. DRF(Django Rest Framework)의 APIView 자체도 from django.views.generic import View를 상속받아서 만든 것이다. View에 API에 주로 쓰도록 기능이 추가된 형태로 볼 수 있다. APIView의 as_view 메소드를 보자. @classmethod def as_view(cls, **initkwargs): """ Store the original class on the view function. This allows us to discover information about the view when we do URL reverse lookups. Used for breadcrumb generation. """ if i..

Q. 장고Django에서 외래키ForeignKey 필드의 id를 얻을 때, field.id를 쓰지 말고 field_id를 써야 하는 이유는?

A. 쓸데 없이 데이터베이스에 Select 쿼리를 날리기 때문이다. 간단히 다음과 같은 장고 모델이 있다고 하자. 전체 코드는 DRF_CRUD 예제에서 확인할 수 있다. from django.db import models class Category(models.Model): name = models.CharField(max_length=200) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Beverage(models.Model): name = models.CharField(max_length=200) category = models.ForeignKey(Cat..

Q. 장고에 gunicorn을 같이 써야 하는 이유는?

A. CPU가 여러개인 환경에서는 훨씬 빠르기 때문이다. 그밖에 HTTPS 적용 등 다양한 기능을 활용할 수 있다. 먼저 이 글 Q. NGINX, gunicorn없이 Django장고만 실행 가능할까? 을 참고해서 gunicorn 없이 테스트를 진행하자. gunicorn 설치하고 실행하기 아래 명령어를 참고해서 gunicorn을 설치하고 실행하자. $ pip install gunicorn $ sudo GUNICORN_CMD_ARGS="--bind=0.0.0.0:80 --workers=3" ./venv/bin/gunicorn config.wsgi:application 설정 설명을 보면 추천 worker수는 CPU core수의 2~4배다. Worker Processes workers Command line: ..

Q. NGINX, gunicorn없이 Django장고만 실행 가능할까?

A. 보통은 Nginx - gunicorn - Django로 구성한다. 보통 권장되지 않지만 Django장고만 실행할 수도 있다. 로컬에서 테스트할 때처럼 하면 되고 차이점은 서버 실행 명령어다. 실행 방법 직접 해보면 잘 된다. 장고 실행하기 우선 EC2에 장고를 설치하고 실행해보자. django_minimal을 참고하자. 아래 실행 환경은 EC2 Ubuntu 20.04(t2.micro)다. EC2에 접속해서 아래처럼 진행하면 된다. $ sudo apt update $ sudo apt install python3.8-venv $ mkdir django_minimal $ cd django_minimal$ $ python3 -m venv venv $ source ./venv/bin/activate $ pi..

Q. 장고 ORM에서 OneToOneField와 ForeignKey에 unique=True를 한 경우 서로 어떤 차이가 있을까?

A. 데이터베이스 상으로는 차이가 없다. 예제 코드는 DRF CRUD 예제 프로젝트를 활용했다. 데이터베이스 설정만 MySQL로 변경했다. 변경한 예는 아래와 같다. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'root', 'PASSWORD': 'password', 'HOST': '127.0.0.1', 'PORT': '3306', } } 환경은 장고는 3.2.12 파이썬은 3.8 버전이다. ForeignKey 그냥 ForeignKey 모델이다. from django.db import models class Category(models.Model): name = models.CharField..

DRF(Django Rest Framework) API 서버에 requests로 PUT할 때 나타나는 이상현상

BooleanField로 설정한 필드의 값이 만약 default=false라면 모두 false로 변경된다. 간단히 테스트를 위해서 DRF로 API 서버를 만들었다. 주요 모델은 아래처럼 생겼다. (예제코드: DRF CRUD) 모델 class Category(models.Model): name = models.CharField(max_length=200) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Beverage(models.Model): name = models.CharField(max_length=200) category = models.ForeignKe..

Q. 장고Django에서 unsigned integer로 primary key를 변경하는 방법은?

A. custom 모델을 따로 만들어 줘야 한다. 보통 MySQL에서 auto increment primary key 설정할 때 unsigned로 하는데 장고는 integer를 쓰든, bigint를 쓰든 signed가 기본으로 설정된다. 왜 그렇게 하는지 이유는 모르겠다. 장고 기본 설정과 달리 unsigned로 하고 싶다면 custom 모델을 만드는 방법 밖에 없다. 아래 코드가 custom 모델 예이다. 위 모델을 불러다가 Book이란 모델을 만든다면 아래처럼 작성해야 한다. 이렇게 하면 auto increment되는 unsigned primary key를 만들 수 있다. class Author(models.Model): id = UnsignedAutoField(primary_key=True) .....

장고django API 서버 개발 - 안드로이드Android retrofit2 이용 시 request body 처리

가끔 아무 것도 아닌 걸로 긴 시간을 보내게 된다. retrofit2에서 이런 식으로 구현했다면 @Headers("Content-type: application/json") @POST("test") Call postTest(@Body TestData testData); 당연히 post로 body로 보내지는 데이터 형태도 json 형태다. request.body.decode('utf-8')을 로그 찍어보면 데이터가 {"name"="ted", "age"=40} 이런 형태로 들어온다. django에서는 따라서 import json body = json.loads(request.body.decode('utf-8')) 이렇게 데이터를 받아야 한다. 하지만 이렇게 받고 있었다. from urllib.parse im..

Q. 장고django 같은 네트워크 상의 다른 기기 접속 허용하는 방법은?

A. 현재 실행 컴퓨터 IP address 나 0.0.0.0를 적어줘야 한다. 그래야 같은 네트워크 상의 다른 기기에서 접속 가능하다. python manage.py runserver 그냥 이렇게만 실행할 경우에는 같은 네트워크 상의 다른 기기에서 접속이 안 된다. 예를 들어 로컬에서 장고 실행시, 같은 네트워크 상의 모바일 기기에서는 장고를 실행한 로컬 컴퓨터의 ip 주소를 192.168.0.3:8000 이런 식으로 넣어도 접속이 안 된다. python manage.py runserver 0.0.0.0:8000 또는 python manage.py runserver 192.168.0.3:8000 로 실행하면 외부에서 접속 가능하다. 이 때 반드시 포트 번호를 적어줘야 한다. 포트 번호는 다른 번호로도 가..

Q. 장고에서 POST방식 x-www-form-urlencoded된 데이터를 딕셔너리로 바꾸는 법은?

A. parse_qsl을 사용하면 된다. 한줄로 끝난다. 주의할 점은 반드시 .decode('utf-8')을 추가해줘야 한다. 추가해 줘야 하는 이유는 request.body의 type이 bytes이기 때문이다. decode로 str으로 바꿔줘야 한다. from urllib.parse import parse_qsl body_data = dict(parse_qsl(request.body.decode('utf-8'))) 개발 환경 python 3.9 django 3.1.6

Q. 장고django에서 post, put, delete 방식 사용 위해서 csrf 끄는 방법은?

A. @csrf_exempt 를 사용하면 된다. 참고: csrf란? 사이트 간 요청 위조 API를 만들 경우 CSRF 보안이 필요하지 않다. API 서버는 API Key 등 다른 인증 방식을 사용한다. 그래서 csrf를 끌 필요가 있다. 출처: Cross Site Request Forgery protection from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def my_view(request): return HttpResponse('Hello world') 코드 예는 다음과 같다. from django.http import JsonResponse from django...

파이썬 장고Django request에서 파라미터parameter 값 갖고 오기

GET 방식으로 key란 파라미터의 값을 가져온다면? ?key=1234 key = request.GET.get('key', None) 로 가져오고 만약에 key란 파라미터가 없다면 None이 된다. 참고: django.http.request Documentation self.GET = QueryDict(mutable=True) self.POST = QueryDict(mutable=True) QueryDict에 대한 설명을 찾아보면 다음과 같다. (출처: django.http.QueryDict) QueryDict implements all the standard dictionary methods because it’s a subclass of dictionary. Exceptions are outlined..

Q. Python파이썬 웹프레임워크 Django장고 이름의 유래는?

A. Django는 재즈 집시 기타리스트 이름에서 따왔다. 공식 문서를 보면 아래와 같이 설명이 나온다. (출처: Django documentation FAQ: General) What does “Django” mean, and how do you pronounce it? Django is named after Django Reinhardt, a jazz manouche guitarist from the 1930s to early 1950s. To this day, he’s considered one of the best guitarists of all time. Listen to his music. You’ll like it. Django is pronounced JANG-oh. Rhymes with ..

반응형