Contents 1. 배경 장고에서 User역할을 하는 app을 따로 생성한 뒤, SignUp을 CreateView를 상속받아 사용할 수 있습니다. 이때, form_class로 UserCreationForm을 이용하면 아래와 같은 [Manager isn't available; 'auth.User' has been swapped for 'accounts.User'] 에러가 발생합니다. 원인과 이를 해결하는 방법을 알아보겠습니다. 2. 해결 1) 원인 저는 User를 accounts라는 app으로 새로 만들었습니다. settings.py에 AUTH_USER_MODEL = "accounts.User" 도 잘 추가해 줬습니다. 그런데 SignUpVIew에서 form_class로 사용하는 UserCreationF..
Contents 1. 배경 장고에서 데이터를 불러오는 방식은 ORM의 Lazy-Loading을 기본으로 하고 있습니다. 이는 데이터가 필요한 시점에, 알맞은 쿼리를 최적화해서 DB에 날리는 방식입니다. 일반적으론 이 최적화가 잘 작동해서, 알아서 최소한의 쿼리만 날립니다. 하지만, 몇몇 경우에서 N번 쿼리를 더 날리게되는 N+1 문제가 발생합니다. N+1 문제의 예시를 보겠습니다. 첫째로, 다른 테이블의 데이터에 접근할 때, 이미 쿼리를 날렸는데, 원하는 정보가 없는 경우 N번에 걸쳐 반복하며 쿼리를 날리게 되는 경우입니다. 또 다른 예로는, N개의 데이터에 대해 명시하지 않은 필드에 접근할 때도 처음에 쿼리를 날리고, 이후에 필드가 없다 보니 N번에 걸쳐 추가적인 쿼리를 날리는 문제를 의미합니다. 이 ..
# 콘솔창에서 SQL 쿼리 보기 LOGGING = { "version": 1, "disable_existing_loggers": False, "handlers": { "console": { "level": "DEBUG", "class": "logging.StreamHandler", }, }, "loggers": { "django.db.backends": { "handlers": ["console"], "level": "DEBUG", }, }, } Contents 1. 배경 장고에서는 DataBase API로 ORM을 쓰기 때문에 실제 사용할 때, SQL 쿼리가 어떻게 동작하는지 알고 싶은 경우가 많습니다. 특히 특정 기능에서 속도가 느린 경우, SQL 쿼리가 어떻게 되는지 먼저 확인하면 매우 좋습니다. ..
Contents 1. 배경 장고에서는 다양한 방법으로 로그인한 유저만 허용하도록 할 수 있습니다. 예를 들어, 커뮤니티 웹사이트에서 글 목록까진 볼 수 있지만, 글을 보려면 로그인해야 볼 수 있게 할 수 있습니다. 이는 장고의 View단에서 구현됩니다. 유저가 로그인했는지를 판단하는 3가지 방법을 알아보겠습니다. 2. 방법 1) request.user로 판단 def index(request: HttpRequest) -> HttpResponse: if not request.user.is_authenticated: return redirect("/accounts/login/") qs = Post.objects.all() return render(request, "blog/index.html", context..
Contents 1. 배경 장고에서는 기본적으로 User Authentication 즉, 유저 인증 시스템을 가지고 있습니다. 이를 간단히 활용하여, 로그인 로그아웃을 구현해보겠습니다. 2. 해결 1) accounts app 만들기 python manage.py startapp accounts 2) settings.py에 등록 INSTALLED_APPS에 추가해줍니다. 3) urls.py에 path include 가장 루트의 urls.py(저의 경우 mysite/urls.py)에 path 객체를 추가해줍니다. include 함수에 "accounts.urls"를 해주게 되면, accounts 폴더 내부의 urls.py를 자동으로 읽어옵니다. 4) accounts/urls.py 생성 + 로그인 뷰 간단 구현..
Contents 1. 배경 지난 포스팅에서 django command를 이용해 메일을 보내봤습니다. ([Django] django command로 메일 보내기 기초 사용법(feat. naver mail)) 이번엔 HTML 템플릿을 활용해 보겠습니다. HTML에 예쁘게 메일을 작성하고, 제목, 내용만 django의 문자열 값을 받아서 rendering하여 메일을 발송해보겠습니다. 2. 해결 1) html template 찾기 및 저장 구글에서 무료 메일 html template을 검색해서 아래 템플릿을 찾았습니다. (github link: https://github.com/ColorlibHQ/email-templates/tree/master/10) 깃허브에서 해당 index.html을 복사하여 blog 하..
Contents 1. 배경 django에서는 commands 인터페이스를 제공해 줍니다. 이전 시간에 .env를 이용해 중요한 사항들을 따로 정리하는 방법을 알아보았습니다. (링크: [Django] .env(dotenv)파일 기초 사용법 (feat. naver smtp 메일 보내기)) 이를 바탕으로 Django에서 커맨드를 생성하고, 메일을 보내보는 실습을 해보겠습니다. 2. 해결 1) blog앱 내부에 managements/commands 디렉토리 생성 commands 폴더 내부에 command로 쓰고자 하는 명령어로 python 파일을 만들면 됩니다. 저는 send_mail이라는 명령어를 사용할 것이기 때문에, send_mail.py를 만들었습니다. (__init__.py는 해당 폴더가 파이썬 폴더임..
Contents 1. 배경 장고는 간편한 템플릿 시스템을 가지고 있습니다. 하지만, 스타일링은 따로 지원하지 않습니다. django-bootstrap5를 설치하고, 간단하게 적용해보겠습니다. 2. 해결 1) 설치 python -m pip install django-bootstrap5 저는 이미 설치해서 Requirement already satisfied라고 나옵니다. 2) settings.py INSTALLED_APPS에 "django_bootstrap5" 추가 3) base.html에 적용 // 불러오기 {% load django_bootstrap5 %} load를 통해 라이브러리 import 하듯이 불러올 수 있고, 아래 두줄을 통해 스타일을 적용할 수 있습니다. // 스타일 적용 {% bootst..
Contents 1. 배경 django를 사용하다 보면, API Key나 이메일 보내기 기능의 ID, Password 등의 정보를 시스템적으로 사용할 때가 있습니다. 보통 코드를 깃으로 관리하기 때문에 이런 중요정보가 코드 내부에 있으면 해킹당할 위험이 매우 높습니다. 그래서 django에서는 .env 파일을 이용해 이런 중요 정보를 환경 변수로 사용함으로써 보안을 유지합니다. 설치부터 기초 사용법까지 알아보겠습니다. 2. 해결 위 과정을 naver smtp 메일 보내는 기능을 추가하는 예시와 함께 알아보겠습니다. 1) 설치 python -m pip install django-environ 2) .env 파일 작성 주요 정보는 빨간색으로 가렸습니다. 참고로 .env파일은 깃허브에 올라가지 않도록, .gi..
Contents 1. 배경 장고에서는 user model은 디폴트로 authentication을 정말 잘 만들어서 제공해줍니다. username, id, First name, Last name, email, password, 가입 날짜, 마지막 로그인 날짜, admin 설정 등등을 기본으로 제공해줍니다. 그렇기 때문에 그냥 제공해주는 User Model을 써도 충분하지만 커스텀하는 방법에 대해 한번 알아보겠습니다. User 모델을 따로 만들고, admin 부분까지 커스텀을 진행해 보겠습니다. 2. 해결 1) python manage.py startapp users 저는 이름을 users로 했지만, 원하는데로 설정 가능합니다. 2) users app의 model.py AbstractUser을 상속받아 Us..
Contents 1. 배경 python manage.py startapp 으로 앱을 만들었다면, django settings.py에서 해당 app을 등록해야 합니다. INSTALLED_APPS라는 리스트에 작성함으로써 앱을 등록하는데요. 어떨 때는 app이름만 작성하고, 어떨때는 app이름.apps.Config 형식으로 작성합니다. 어떤 차이가 있을까요? 2. 해결 python manage.py startapp blog라는 앱을 만들었습니다. blog의 apps.py를 보면 아래와 같습니다. 상위에 BlogConfig라는 클래스가 있습니다. INSTALLED_APPS리스트에 "blog.apps.BlogConfig"를 등록하는 것은 정확히는 blog폴더의 apps.py의 BlogConfig 클래스를 등록한..