장고(django) cache를 활용하자

장고 캐시 장고에 캐시 기능을 모르고 있었다가 우연치않게 알게 되었다. 그동안 블렉스의 모든 주제를 호출할때 정말 많은 DB 호출이 필요해서 어떻게 개선해야하나 고민하고 있었는데 캐시를 사용해서 해결할 수 있었다. 아래는 필자의 상황에 맞게 구성된 코드지만 충분히 이해하고 응용가능 할 것이다. 1 2 3 4 5 6 7 8 9 10...

장고(django)에서 필터 date range 사용

Django 2.0에서 date range 2.0에선 시간을 문자열로 변환하여 사용했는데 문제없이 잘 됐다. 1 2 3 4 date_format = "%Y-%m-%d %H:%M:%S" seven_days_ago = (datetime.datetime.now() - datetime.timedelta(days=7)).strftime(date_format) now_date = datetime.datetime.now().strftime(date_format) return Post.objects.filter(created_date__range=[seven_days_ago, now_date], ...).reverse() Django 2.2에서 date range 위 방법을 그대로 사용하면 naive datetime이라고 뜨면서 위험하다고 알려준다. 해결 방법을 계속해서 찾았는데 타임존으로...

장고(django)에서 이미지 업로드

이미지 업로드 장고로 이미지 업로드 하는 방법을 찾아보면 대부분은 모델에 이미지 필드를 추가하고 폼을 생성하여 사용자에게 사진을 받는 방식으로 진행된다. 혹시나 그 방법이 궁금해서 들어온 방문자가 있을까 해당 방법과 동시에 필자가 이번에 찾아본 필드 추가 없이 업로드를 하는 방법을 정리할 것이다. 이미지 필드로 업로드 1 2 3 4 5 6...

장고(django)에서 QuerySet 합친 후 정렬

블로그 서비스에서 유저의 활동을 보여주고 싶었다. 가령 댓글, 좋아요, 시리즈 생성, 포스트 작성을 한 눈에 확인할 수 있도록 말이다. 이전에는 댓글을 우선 나열한 후 좋아요를 나열했는데 시간순서에 맞게 모든 항목을 조합하여 보여주고 싶었다. +도 안되고 어떻게 합칠까 어떻게 정렬시켜야 할까 정말 삽질도 많이하고 검색도 많이 했는데 엄청난 함수가 있었다. 1...

장고(django)에서 JSON 응답

이전에 유저 알림 기능을 구현할때 JSON으로 응답하는 것에 익숙치 않아서 2번의 요청을 보내야 했다. 첫 요청에서 알림의 갯수를 카운트하고 알림이 있다면 알림을 다시 요청하고 HTML을 렌더링해서 사용자에게 보내주었다. 두 응답 모두 문자열로 이루어졌고 기능이 정상적으로 동작하기에 유지하고 있었으나 최근 HASH MAP을 공부하면서 파이썬의 Dict와 JSON에 흥미가 생겨 알림도 JSON 응답으로...

장고(django)에서 의도적인 404 일으키기

원하는 모델을 찾을 수 없을때 404 발생시키기 1 2 3 from django.shortcuts import get_object_or_404 user = get_object_or_404(User, id='baealex') 의도한 URL 혹은 GET, Parameter가 아닐때 404 발생시키기 1 2 3 4 5 6 from django.http import Http404 def setting(request): tab = request.GET.get('tab', '') if not tab in [ '', 'account', 'profile',...

RESTful API의 개념과 장고의 REST Framework

제작중인 서비스형 블로그의 발전을 위해서 RESTful과 프론트엔드 프레임워크의 도입을 시도하고자 하였다. RESTful API의 개념은 어느정도 알고 있었지만 이를 어떻게 장고에서 구현하는지가 이 글의 핵심이다. REST란? REST는 Representational State Transfer의 약어로서 웹의 장점과 HTTP의 우수성을 제대로 활용할 수 있는 아키텍처이다. HTTP URI를 통해서 자원을 명시하고 HTTP Method(POST, GET, PUT, DELETE)를 통해서...

장고(django)에서 검색(filter에서 OR) 만드는 방법

검색도 사실 큰 어려움은 없지만 새로 알아야 하는 것들이 있다. 필드안에 텍스트를 포함하는 함수나, OR 연산을 할 수 있도록 해주는 라이브러리 등이 그것이다. 생성된 모델 1 2 3 4 class Post(models.Model): author = models.ForeignKey('auth.User', on_delete=models.CASCADE) title = models.CharField(max_length=50) text = models.TextField() 우리가 검색할 모델의 구조는 위와 같다. 블로그라는 가정하에 포스트는...

처음부터 다시 장고(django)

장고 프로젝트를 하면서 이제는 장고를 어느정도 다룰 줄 아는 실력이 된 것이 아닌가 싶었다. 그런데 다른 새로운 프로젝트를 시작하려고 봤더니 괜히 불안했다. ‘처음 시작은 어떻게 하더라?’, ‘사용했던 패키지를 다 기억할 수 있을까?’ 싶은 생각이 들었기 때문인 것 같다. 그러다 필자가 예전에 작성한 장고 시작하기!라는 글을 보는데 당시에는 이런 개발 순서가...

장고(django) 떠먹여 주는 UWSGI와 NGINX 연동

UWSGI 연동에 많은 수행착오를 겪은 뒤 스트레스와 두려움 때문에 proxy_pass로 버텨오다가 소셜 계정 로그인을 추가하다가 어쩔 수 없이 도입을 해야할 것 같았다. 막상 추가하고 보니 proxy_pass와 크게 다른 것은 없어 보인다. 다만 기존의 runserver로 돌리는 거보단 역시 귀찮다. 1. PIP 설치 필자는 파이썬 가상 환경에서 설치를 진행했다. 1 pip install...

장고(django)에서 이메일 전송, 사용자 메일 인증

이메일 전송할 때 SMTP 서버부터 구축해야 하는 줄 알고 미뤄두고 있었는데 정말 간단한 방법으로 메일 전송이 가능했다. 우선 settings.py에서 아래 내용을 추가한다. 1 2 3 4 5 EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_HOST_USER = 'USER_NAME@gmail.com' EMAIL_HOST_PASSWORD = 'USER_PASSWORD' EMAIL_USE_TLS = True 유저와 패스워드에는 자신의 아이디와 패스워드를 입력하면 된다. 위...

장고(django) 댓글 구현하는 방법

처음엔 장고에 익숙하지 않아서 우왕좌왕했는데 이제 익숙해지니 작업의 순서를 기억하며 작업하니 쉽게 느껴진다. 장고에서 작업할 때 기억해야 하는 것 모델 폼 URL 뷰 탬플릿 모델 만들고 모델 사용할 폼 만들고 폼을 사용할 URL을 만들고 URL에서 사용할 뷰를 만들어 준다고 머릿속에 각인해두자! 만들어진 뷰는 탬플릿에서 호출한다. 먼저 밝히는 것은 이 글에서...

장고(django) Pagination과 무한 스크롤 구현

제작중인 블로그에 무한 스크롤을 적용할 필요가 있었다. 무한 스크롤은 사용자가 필요한 만큼만 리소스를 요청하고 적용하기도 간단하다. 이 블로그에도 무한 스크롤을 적용했는데 그래서 더 무한 스크롤에 집착이 생긴다. 너무 좋은 기능이다. 여하지간 무한 스크롤을 사용하기 위해선 Pagination이 되어 있어야 하는데 장고에서 페이지네이션을 구현하는 것이 매우 간단했다. views.py 우선 페이지 네이션을 구현하기...

장고(django) 사이트맵 생성 방법

장고로 블로그를 개설하고 있는데 사이트맵은 SEO를 향상시키기 위해서 아주 기본적으로 제출해야 할 필수 요소다. 사이트맵은 봇에게 사이트의 구조를 알려준다. 필자는 장고에서 이 기본적인 사이트맵을 생성하는데 큰 난항을 겪었다. 겪은 이유는 대표적으로 장고의 메인 문서가 영어라는 것 나름대로 고집피워 소스를 정리하려고 했던 것 위 두가지 이유가 있었다. 영어라서 한 50% 정도만...

장고(django) 좋아요 버튼 만들기(AJAX)

필자는 미디움을 참고하여 결과물을 만들고 있다. 장고를 이제 좀 알겠다 싶었으나 제자리 걸음을 하고 있는 듯한 느낌이다. 이게 장고에 익숙하지 않아서 그런건지 데이터 베이스를 아직도 잘 모르는 건지 판단이 안된다. 여튼 좋아요 버튼을 만들어 보았다. 1.MODEL “좋아요는 댓글처럼 모델을 따로 만들어야 하나?”라는 고민을 했었지만 ManyToManyField를 사용하면 한 사용자가 한 포스트에...

장고(django) 템플릿에서 시간 비교

템플릿에서 아래 소스코드처럼 시간을 비교하려 하는데 안됐다. 1 {% if post.updated_date > post.created_date %} 안된다고 하기엔 좀 애매하긴한데 여하지간 의도한 바로는 새로 생성한 포스트에서는 안떠야 정상인데 뜬다. 그래서 찾아보니 다음과 같이 하면 된다고 하여 시도해 보았다. 1 {% if post.updated_date.date > post.created_date.date and post.updated_date.time > post.created_date.time %} 날짜끼리 따로 비교하고...

장고(django) No Such Table 에러

당신이 이 오류를 겪고 있는 이유는 다음과 같을 것이다. DB를 삭제하고 다시 만든 경우 models.py를 확장한 경우 1번의 경우라면 간단하게 해결이 가능하다. migrate 할 때 아래와 같은 옵션을 덧붙혀서 데이터베이스를 생성하면 된다. 1 python manage.py migrate --run-syncdb 2번의 경우 필자는 이제껏 DB를 삭제하고 다시 생성하는 쉬운 방법을 택했으나 실제 서비스를...

장고(django)에서 마크다운(markdown) 적용하는 방법

장고의 포스트 모델이 단일 텍스트 필드라서 새로운 문서 에디터라도 넣어야되나 싶었다. 관련된 내용을 인터넷에서 찾아보니 깃허브에서 텍스트를 마크다운으로 변환해주는 API를 제공해 주는데, 글을 작성한 분께서는 파이썬의 requests 라이브러리를 이용하였다. 텍스트를 주고 HTML을 가져오는 것이다. 동적으로 변환해주면 매우 간단한데다 마크다운으로 저장되어 있으니 변환해 줄 필요없이 사용자가 편리하게 글을 편집할 수 있을...

장고(django) 시작하기 in 우분투

오늘 처음으로 파이썬으로 웹을 구현하는 방법에 대한 궁금증을 가졌다. 그것은 다름이 아닌 기말고사에 시험이 없고 뭘 한다는 거였는데 일단 뭐라도 익혀주면 좋겠지 싶어서 필자가 젤 관심있는 웹을 연관시켰다. 찾아보니 플라스크, 장고가 가장 많이 이용되는 듯 하다. 플라스크를 먼저 공부하고 장고를 해보려했지만 튜토리얼은 장고쪽이 더 잘 만들어져 있어서 먼저 장고를 택했다....