[Django] 마이그레이션 파일에 초기 데이터 넣기
·
Django,Python
Django에서 마이그레이션 파일을 만들때  --empty 옵션으로 빈 마이그레이션 파일을 생성할 수 있다.공식문서: https://docs.djangoproject.com/en/5.0/topics/migrations/#data-migrationspython manage.py makemigrations --empty 생성된 마이그레이션 파일에 초기 데이터를 넣는 로직을 작성하면 된다.추가로, 마이그레이션을 되돌릴때 로직도 넣을 수 있다. 필수는 아니지만 작성하지 않으면 마이그레이션을 되돌릴때 에러가 발생한다. 그러므로 빠른 개발을 위해 넣어주는 것이 좋다.# Generated by Django 5.0.6 on 2024-07-23 06:47from django.db import migrationsfrom ..
[Django] 개발 서버는 멀티 스레드?
·
Django,Python
wsgiref내가 알기론, Django 내장 서버인 wsgiref는 한 번에 하나의 요청만 처리할 수 있는 싱글 스레드로 동작한다고 알고 있었다.하지만, locust를 사용해서 한 번에 수십개의 요청을 동시에 받는 상황을 재현해보니, 로그가 순서대로 찍히는 것이 아니라 뒤죽박죽 찍혀있는 것을 확인할 수 있었다. 멀티 스레드로 동작하는건가싶어 thread id를 콘솔에 출력해보았더니, 각 요청마다 다른 thread id가 찍혀있는 것을 확인할 수 있었다.예제 코드class ConcurrencyTestView(APIView): permission_classes = (AllowAny, ) def do_long_task(self): sum = 0 for i in range(0..
[Django] shell_plus로 개발 생산성 높이기
·
Django,Python
Django로 개발하다 보면 shell을 사용할 일이 자주 있는데, 그때마다 model들을 import 해주기가 정말 번거롭고 귀찮다.django-extensions라는 모듈에는 shell_plus 명령어가 있는데, shell_plus를 사용하면 model, db관련 객체들을 자동으로 import 해줘서 개발 생산성을 높일 수 있다.django-extensionspip install django-extensionsdjango-extensions를 설치하고나면, INSTALLED_APPS에 추가해준다.INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django..
[Django] Django에서는 HTTP 요청을 어떻게 처리할까?
·
Django,Python
Django의 Request-Response CycleDjango에서는 HTTP 메시지로 요청이 들어오면 미들웨어를 거쳐 HttpRequest 객체를 만든다.settings.py에 있는 ROOT_URLCONF에서 urlpatterns를 순서대로 찾는다.ROOT_URLCONF = ".urls"request의 url과 일치하는 패턴이 있다면 찾기를 종료하고 (클래스 기반 뷰의 경우) as_view 함수를 실행한다. (request 인자를 넘겨준다.)# ~/login으로 찾는다면urlpatterns = [ path("register/", member_auth_views.MemberRegisterView.as_view()), path("login/", member_auth_views.MemberLoginVi..
[Django] 동시성 고려하기(2) - optimistic lock 적용하기
·
Django,Python
optimistic lock이란?optimistic lock은 낙관적 락으로 실제로 DB에서 row에 lock을 거는것이 아닌, 어플리케이션 레벨에서 version 정보를 활용해서 수정 여부를 확인하는 방식이다.트랜잭션 대부분은 충돌이 발생하지 않을것이다라고 낙관적으로 가정해서 일단 수정하고 DB에 저장을 하려고 할때, 누가 이미 수정했는지 체크한다. 그래서 트랜잭션의 커밋이 끝나기 전에는 수정됐는지 확인할 수 없다.version이 뭐지?version은 이 row의 버전을 의미한다. version은 타임스탬프일수도 있고 Auto Increment 값일 수도 있다. version 정보를 활용해서 경쟁상태인지 체크하는 방법은 아래와 같다.하나의 row를 SELECT 해서 메모리에 가져온다. 여기엔 버전 정보..
[Django] 동시성 고려하기(1) - F 객체 사용하기
·
Django,Python
서비스를 운영하다보면 여러 사용자가 동시에 하나의 자원을 다루는 경우가 생긴다.예를 들어 상품을 구매해서 재고가 -n개 줄어든다거나, 자리 예매를 한다거나의 상황이 있을 수 있다.티켓팅처럼 2명 이상의 유저가 하나의 자원을 두고 경쟁하는 상태를 경쟁 상태라 한다. 오늘은 Django ORM의 기능인 F 객체로 경쟁 상태를 해소하는 방법에 대해 정리해보았다.F 객체란?장고 공식문서에 소개되어있듯이, F 객체를 사용하면 데이터를 직접 어플리케이션 메모리에 올리지 않고도 사용할 수 있다.예를 들어 상품을 구매하고 재고를 1개 차감할때, 재고 데이터를 메모리에 직접 불러오지 않고 값을 -1 할 수 있는것이다. django shell_plus를 사용해서 테스트해보았다.from django.db import mod..
[Django] factory_boy
·
Django,Python
로컬에서 개발하다보면 더미 데이터들이 필요할 때가 있다. 간단하게 스크립트를 만들어서 이렇게 구현해줄 수 있는데, from post.models import Post def create_dummy_posts(): for i in range(100): Post.objects.create( title=f'title-{i}', content=f'content-{i}' ) 이 데이터들은 우리가 직접 값을 지정해줘야하고, 여러가지 케이스가 필요한 경우에는 대응하기 힘들다. 그래서 더미데이터들을 만들때 faker라는 라이브러리를 많이 사용하는데, factory_boy라는 모듈이 faker도 지원해주고, 장고 모델도 지원해줘서 소개해보고자 한다. factory_boy — Factory Boy stable docume..
[Python] Pickle
·
Django,Python
Python pickle Python 에서 pickling 한다는 것은 파이썬 빌트인 객체인 list, tuple 등을 binary 데이터로 만든다는 것이다. Pickling 한 객체를 다시 파이썬 객체로 역직렬화하면 파이썬에서 바로 쓸 수 있는 객체가 된다. import pickle if __name__ == '__main__': with open('test.bin', 'wb') as fw: pickle.dump({'test': 'test', 'list': [(1, 2), {3, 5, 6}]}, fw, protocol=5) with open('test.bin', 'rb') as fr: result = pickle.load(fr) print(result) print(result['test']) print..
[Django] Custom Command 만들기
·
Django,Python
장고로 개발할때 python manage.py 로 명령어를 실행한다. 예를 들면 runserver, shell, shell_plus 등등.. 이 명령어는 미리 지정된것만 사용할 수 있는게 아니라, 개발자가 직접 custom command를 추가할 수도 있다. 실습 1. /management/commands 에 command 파일을 만든다. post라는 앱이 INSTALLED_APPS에 등록되어있으면, manage.py command에 test_command가 등록된다. 주의 파일명이 _로 시작한다면 manage.py command에 등록되지 않는다. python manage.py 을 실행하면 django.core.management call_command가 실행되는데 여기서 load_command_cla..
[Django] on_delete=CASCADE
·
Django,Python
장고에서 모델을 만들때, on_delete=models.CASCADE라고 설정하면 외래 키의 주인 테이블이 drop 되거나, 행이 삭제되거나 했을때 자동으로 삭제되는걸로 생각한다. 아래의 예제를 보면 Product가 삭제되면 그 Product를 참조하고 있는 ProductItem도 같이 삭제될것이다. class Product(models.Model): title = models.CharField(max_length=40) repr_price = models.IntegerField() status = models.CharField(max_length=20) def __str__(self): return f'{self.title}({self.repr_price})' class ProductItem(model..
togeepizza
'Django,Python' 카테고리의 글 목록