본문 바로가기

프로그래밍/Django

[django] Django로 순식간에 블로그 만들기 (무작정 따라하기)

반응형


자바가 슬슬 머리 아플때쯤.. 새로운 웹 프레임 워크를 가지고 놀기 위해.. 장고(Django)에 삽을 들어보았습니다. 장고를 익히기 위해 무작정 유튜브에서 튜토리얼을 검색해보니 참고할만한 슬라이드가 있어서 정말 무작성 따라하기 시작..

따라가는데 큰 무리는 없었찌만 대략 2년전에 발표된 자료라서 조금씩 변경딘 점이 있겠지만.. 기본 골짜는 같을거라는 생각에 시작하게 되었다. 헌데 의외로 세팅할때 슬라이드와 다른 부분이 있어서 혹시나 비슷하게 삽질을 하고 있다면 참고가 되지 않을까 싶어 정리겸 작성하게 되었다.


우선 원글의 슬라이드 영상은 하단으로


그리고 이 영상에 슬라이드는 http://emocon.weirdx.io/2016fw/slides/chiyodad_django-x-heroku.pdf 이곳이다.

이모콘이라는 곳에서 열린 컨퍼런스인데. 2016 F/W에서 발표되었다. (https://github.com/weirdmeetup/emocon/tree/gh-pages/2016fw/slides )


나또한 이 영상을 보고 맥에서 진행 하였으므로 맥이 기준이다.


대략 과정은

  • brew 설치 후 python3 , pip3, atom 설치
  • heroku 가입
  • toolbelt설치
  • 프로젝트 폴더 생성. git 초기화(로컬 프로젝트)
  • heroku 로그인 및 앱 만들고 연결
  • 파이썬 가상환경 (Virtualenv) 설치후 설정 및 활성화
  • 가상환경에서 django 설치.. django heroku project template 설치 
  • django heroku 를 heroku에 deploy - django heroku 로컬 빌드 확인
  • DB 초기화 - 슈퍼계정 생성 


정도의 간략한 (??) 과정을 거쳐 개발 환경을 구축하고 코딩에 들어간다. 쭉 보니 50분영상에 개발환경 구축이 절반을 넘는다. (대부분의 프레임워크  환경 구축이 그렇듯이........)


이 와중에 2년이나 세월로 인해 바뀐 부분을 삽질한 뒤 기억나는대로(?)  해결 방법을 간단히 적어볼까 한다. 


1. 파이썬을 처음 써봐서 그럴수도 있으나.. 파이썬3를 사용하려면 파이썬2가 있어야한다. (의존성)

- 이것은 파이썬 홈페이지에서 OS별로 다운받으면 된다. 

2. django heroku project template 설치 실패

- 슬라이드에 작성부분에 약간의 오타가 있다 (master.zip 앞에 공백이 하나 있어서 그렇다)

-  (emv)$ django-admin.py startproject --template=https://github.com/heroku/heroku-django-template/archive/master.zip --name=Procfile emocon .

- 직접 공백을 지우기 힘들면 위의 명령어를 복사하면 된다.

3. python manage.py runserver 명령어가 되지 않는다. (로컬 빌드)

- 슬라이드를 그대로 따라하면 다음과 같은 에러가 날것이다.

- ModuleNotFoundError: No module named 'dj_database_url' 라는 에러가 처음에 났었는데 

- 간단하게 dj_database_url을 깔아주면 됫는데. 찾아보니 heroku에서 로컬을 테스트하는 명령어가 따로 있었다.

- (emv)$  heroku local

- heroku local로 테스트를 하면 gunicorn과 dj_database_url 와 django_heroku 라는 것이 없다고 에러가 난다. 

- (emv)$ pip install gunicorn

- (emv)$ pip install dj_database_url

- (emv)$ pip install django_heroku

로 부족한 의존성들을 설치한 후에 다시 테스트하면 두 명령어가 성공적으로 빌드 되어  로컬 테스트가 가능해진다.

22:59:17 web.1   |  /bin/sh: gunicorn: command not found
22:59:17 web.1   Exited with exit code 127

이런 형식으로 에러가 난다. (나머지 두개의 의존성은 엄청 긴 에러가 나며 에러코드 1과 에러코드 3을 출력한다)


제대로 빌드가 된다음 다음과 같이 나타난다.


[OKAY] Loaded ENV .env File as KEY=VALUE Format

23:02:40 web.1   |  [2018-06-10 23:02:40 +0900] [12351] [INFO] Starting gunicorn 19.8.1

23:02:40 web.1   |  [2018-06-10 23:02:40 +0900] [12351] [INFO] Listening at: http://0.0.0.0:5000 (12351)

23:02:40 web.1   |  [2018-06-10 23:02:40 +0900] [12351] [INFO] Using worker: sync

23:02:40 web.1   |  [2018-06-10 23:02:40 +0900] [12354] [INFO] Booting worker with pid: 12354

23:02:40 web.1   |  [2018-06-10 23:02:40 +0900] [12355] [INFO] Booting worker with pid: 12355



영상의 튜토리얼을 끝냈다. CRUD를 직접 구현하는 건 아니고.. django 템플릿을 이용하여 어느정도 구현이 가능하고.
DB에 데이터를 리스트에 출력하는 정도 선에서 튜토리얼은 끝이 나는데.. 올해 초에 django가 2.0으로 버전이 올라가면서
저 영상대로 튜토리얼을 그대로 따라하면 절대로 동작하지 않는다. 간단하게 튜토리얼 하려고 시작했는데 장고 1.1과 2.0의 변경점을 본의 아니게 찾아보게 되었다 -_-;

결론부터 말하자면 urls.py에서 url 함수는 duplicate되어 아예 컴파일 단에서 에러가 난다. 아예 쓸수 없는것은 아니고..
이는 django.urls 패키지의 re_path 라는 함수로 변경 되어 사용할 수 있다.

그리고 장고 2.0에서 include 함수에서 app_name 를  파라미터로 넘겨주어야 한다고 한다. 

    'Specifying a namespace in include() without providing an app_name '

django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.


빌드시 이런 에러가 나는데.. 아마 namespace=blog 부분이 2.0에서 변경된 부분인 듯하다.

app_name = 'blog' 를 하면 정상적으로 작동된다.

그 외에는 크게 달라진 점은 없는 듯하고.. 파이썬을 아주 오래전에 입문용 언어로 괜찮다하여 생활코딩에서 첫 언어로 잠깐 봤었던게 전부 인 나로서는 다소 난해한 느낌...

views.py에서 Post를 소문자로 했더니 에러가 났었던 정도... 


애초에 개념 설명이 아닌 맛보기 정도이긴 하지만.. 간단한 소감은  압도적으로 코드 라인수는 줄어드는데.. 상당히 신경쓸게 많은 듯한 느낌이었다.
 



그럼 모두 즐거운 코딩 되시길!


ps: 웃긴게 로컬에선 되는데......... heroku에 deploy하면 안된다 -_-;;; 아마 db가 sqlite로 되어 있어서 그런듯... 코드는 찾아서 github에 올려 수정예정

완성 :

https://ssh-emocon2016.herokuapp.com


참고 출처

http://raccoonyy.github.io/django-2-0-release-note-summary/

https://docs.djangoproject.com/en/2.0/ref/urls/

https://stackoverflow.com/questions/48608894/specifying-a-namespace-in-include-without-providing-an-app-name





반응형