본문 바로가기

TechLog

Django 1.4 for Android (only dev. runserver!)

 

지난 5월, zdnet에 재미있는 글이 하나 올라왔었다:

[기고]약정 벗은 안드로이드, 서버가 되다…'서품폰'
http://www.zdnet.co.kr/column/column_view.asp?artice_id=20120518070549

잉여한 안드로이드 폰을 서버로 어떻게 활용할 수 있는지에 대해 설명하고 있는데(web2py, ubuntu … 등을 설치하는 내용이 언급되어 있다), 케냘이 개인적으로 흥미를 갖고 있는 django의 설치에는 실패했다는 이야기가 있었다. 케냘은 언뜻 이해가 가지 않았는데, 'django 자체는 특별히 네이티브 모듈에 의존성이 있는 것도 아니고 python만 제대로 구동되면 별 문제가 없을 것인데 대체 왜...?' 라는 생각이 들었다.

단적으로 표현하자면 '나의 django는 그러치않아아아아' (...)

 

케냘님의 미투포토

 

... 해서 반나절을 삽질하여 django 1.4를 세팅하는데 성공하였다 -_-; 아직은 django의 개발 웹 서버(runserver 커맨드)를 구동하는 정도지만, 손을 더 보면 다른 웹 서버를 통해 django를 구동하는 것도 가능하지 않을까. mod_wsgi 같은 모듈이 호환이 될는지는 모르겠지만... 어쨌든 작업 내용을 여기 공유해 본다:

※ 참고: 모토글램, 루팅된 Android Froyo(2.2)에서 작업하였다.

※ 주의: 안드로이드는 (당연하지만) 일반적인 리눅스 환경과는 달리 설치할 수 있는 패키지에 제한이 있다. 여기서 소개하는 django의 경우에도 django 자체의 개발 서버를 실행하는 것은 가능하지만, django와 함께 사용하는 다른 패키지(south, celery 라든가...)를 easy_install 등으로 설치하는 것도 불가능하며, 패키지를 수동으로 배포하는 경우에도 올바로 동작할지 장담할 수 없다. 그러므로 이건 어디까지나 하나의 시도일 뿐이며, 취미로나 해 볼만한 일이라는 점에 유의하도록 하자.

 

 

 


Django 1.4 on Android
(only dev. runserver!)

 

우선 앱을 몇 가지 설치해야 한다.

Google Play를 통해 설치할 수 있는 것과 apk 패키지를 직접 설치해야 하는 것이 있는데… apk 패키지를 직접 설치해 본 적이 없다고?  그럼 가급적 이 글 내용을 따라 하지 말기를 권한다. 며칠 동안 스트레스를 받게 될 지도 모른다(...)

다음과 같은 도구를 Google Play에서 검색하여 설치하도록 하자:

 

- 파일 관리자

apk를 설치하거나 파일을 수동으로 지워야 하거나 할 경우 필요할 것이다. 케냘은 ES File Explorer를 사용하고 있다.

 

- Terminal Emulator

안드로이드 폰에서 가상 터미널(?)을 실행할 수 있도록 해 준다. 루팅 없이 이 앱만으로 환경 설정을 하는 것도 불가능한 건 아니지만… 안드로이드 폰에서 일일이 타이핑을 하고 있으려면 열이 뻗칠 것이다. 가급적 ssh를 통해 터미널을 사용하도록 하자. 그리고 아래에서 설명하는 .profile 설정은 SSHDroid에 맞춰져 있으므로 Terminal Emulator에 맞게 작업을 하려면 뭔가 더 해줘야 할 것이 있다.

 

- SSHDroid

안드로이드 기기에 ssh로 터미널 접속을 할 수 있게 해 주는 앱. 그 외에도 기본적인 unix 실행 환경을 만들어 주는 역할을 한다. 안드로이드는 스마트폰에 최적화되어 있다 보니, 유닉스에서 기본으로 제공하는 경로(/usr 경로라든가)에 접근이 어렵거니와 기본 유틸리티도 포함되어 있지 않은 경우가 많은데, 이러한 기본 유틸리티를 제공해 주기도 한다.

 

참고로 앱을 실행하면 현재 기기의 IP를 확인할 수 있다. 그리고 기본 패스워드는 메뉴에서 변경할 수 있으므로, 가급적이면 변경해두도록 하자.

 

 

 

아래에 나오는 앱들은 직접 apk 패키지를 설치해야 한다.

 

 

 

- 루팅 앱

루팅 없이도 아래에서 설명하는 작업을 할 수 있을지도 모르겠으나, 케냘은 애초에 루팅 후에 작업을 시작했으므로 무슨 일이 생겨도 해결할 방법을 모른다(...) 어차피 루팅 안 하면 엄청 귀찮아질 테니 순순히 루팅을 하면 유혈사태는 피할 수 있을 것이다. 루팅 도구는 기기와 안드로이드 OS 버전에 따라 상이하므로, 여기서는 생략한다.

루팅이 끝나면, 안드로이드에서 SSHDroid를 실행하고,

 

ssh 접속이 정상적으로 이루어지는지 확인하자(케냘은 맥을 사용하고 있기 때문에 ssh 유틸을 사용하고 있지만, 윈도우 유저인 경우 putty 등의 유틸리티를 사용하자. 10.0.0.14는 안드로이드 기기의 IP 주소이며, SSHDroid 실행 화면에서 확인할 수 있다). 정상적으로 접속되었을 경우 다음과 같은 메시지를 볼 수 있을 것이다:

Kenials-MBA:~ kenial$ ssh root@10.0.0.14

The authenticity of host '10.0.0.14 (10.0.0.14)' can't be established.
RSA key fingerprint is f7:97:44:c3:ab:49:42:14:db:ec:f2:e2:b8:ae:62:74.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.14' (RSA) to the list of known hosts.
SSHDroid
Use 'root' on rooted devices otherwise any username works
Default password is 'admin'
root@10.0.0.14's password:

/data/data/berserker.android.apps.sshdroid/home #

 

 

- SL4A (Scripting Layer for Android) http://code.google.com/p/android-scripting/
- P4A (Python for Android)
http://code.google.com/p/python-for-android/

이름만으로도 대충 짐작이 가겠지만, 외부의 스크립팅 언어를 처리할 수 있도록 해 주는 플랫폼 앱(?)이다. Django는 Python 언어로 작성된 웹 프레임워크이기 때문에 Python 언어를 실행할 수 있는 환경이 필요한데, 이 앱을 사용하면 python 패키지를 안드로이드에 맞게 세팅하여 설치하는 수고를 하는 대신 좀 더 간편하게 python 실행 환경을 만들 수 있다.

다음과 같이 root 모드로 들어가서 패키지를 설치하자. (케냘의 경우 /mnt/sdcard/_apk 경로에 패키지를 다운로드했다)

cd /mnt/sdcard/_apk
wget http://android-scripting.googlecode.com/files/sl4a_r6.apk
wget http://python-for-android.googlecode.com/files/PythonForAndroid_r6.apk
su
pm install sl4a_r6.apk
pm install PythonForAndroid_r6.apk

 

그러면 다음 그림처럼 SL4A와 Python for Android 앱이 설치된 것을 볼 수 있다.

 

먼저 Python for Android 앱을 실행하고, install 버튼을 터치해서 필요한 모듈들을 설치하자:

 

 

설치가 완료되면 SL4A 앱을 실행하여 helloworld.py가 실행되는지 확인하자.

 

 

- .profile 파일 편집

터미널에서 편리하게 python을 실행하기 위해 필요한 내용이다.
다음 명령어를 입력하여 home 폴더로 이동한 후, .profile 파일을 편집하자:

cd
vi .profile

 

.profile 파일의 내용은 다음과 같다:

PATH=/data/data/berserker.android.apps.sshdroid/home/bin:$PATH
export PATH
export EXTERNAL_STORAGE=/mnt/sdcard                                                                                                                                                                                                 
export LANG=en
PYTHONPATH=/mnt/sdcard/com.googlecode.pythonforandroid/extras/python
PYTHONPATH=$PYTHONPATH:/data/data/com.googlecode.pythonforandroid/files/python/lib
PYTHONPATH=$PYTHONPATH:/data/data/com.googlecode.pythonforandroid/files/python/lib/python2.6/lib-dynload
export PYTHONPATH
export TEMP=/mnt/sdcard/com.googlecode.pythonforandroid/extras/python/tmp
export PYTHON_EGG_CACHE=$TEMP
export PYTHONHOME=/data/data/com.googlecode.pythonforandroid/files/python
export LD_LIBRARY_PATH=/data/data/com.googlecode.pythonforandroid/files/python/lib

# create /usr path for django-admin.py
if [ ! -d /usr/bin ];
then
     mount -o remount,rw /
     mkdir /usr
     ln /data/data/berserker.android.apps.sshdroid/home/bin /usr/bin –s
fi
sh 

 

이제 위 스크립트가 실행되도록 sh .profile 명령을 실행하고(ssh로 다시 접속해도 된다), 다음과 같이 python을 sshdroid의 기본 경로에 링크한다:

ln /data/data/com.googlecode.pythonforandroid/files/python/bin/python /data/data/berserker.android.apps.sshdroid/home/bin/python
ln /data/data/com.googlecode.pythonforandroid/files/python/bin/python /data/data/berserker.android.apps.sshdroid/home/bin/python2.6

 

위 과정이 끝났으면 python을 실행해 보자. 다음과 같은 화면이 나오면 성공이다:

 

 

- Django 설치

이제 (드디어!) Django를 설치해 보자.

아까 /mnt/sdcard/_apk 폴더로 가서 Django 1.4 설치 파일을 다운받고 압축을 푼 다음, django 폴더를 python의 라이브러리 폴더에 복사한다.
(안드로이드 기기에서 압축을 풀려면 시간이 오래 걸릴 수도 있으므로, pc에서 압축을 푼 다음 파일을 sdcard에 직접 복사해도 된다)

cd /mnt/sdcard/_apk
wget http://www.djangoproject.com/m/releases/1.4/Django-1.4.tar.gz
tar xzvf Django-1.4.tar.gz
cd Django-1.4
cp -r django /data/data/com.googlecode.pythonforandroid/files/python/lib/python2.6/lib-dynload/django     # instead of 'python setup.py install'
ln /data/data/com.googlecode.pythonforandroid/files/python/lib/python2.6/lib-dynload/django/bin/django-admin.py /data/data/berserker.android.apps.sshdroid/home/bin/django-admin.py

안드로이드에서는 일반적인 파이썬 패키지에 포함되어 있는 setup.py를 통해 패키지를 설치하는 것이 불가능하다. 안드로이드에는 컴파일러를 포함한 개발 관련 유틸리티(예를 들면 gcc 같은)가 없기 때문인데, 그래서 위와 같이 django 폴더를 곧바로 lib-dynload 폴더(p4a에서 사용하는 라이브러리 폴더이다)에 복사하는 것이다.

* 일반적인 파이선 패키지의 경우라면 site-packages 패스에 두는 것이 맞겠지만, Python for Android의 경우 관련 파일이 sdcard에 설치되면서 site-packages 패스도 sdcard에 생성된다. (기기에 따라 특성이 다를 수는 있으나) sdcard의 경로에 django 패키지를 배치하면 실행 속도가 현저히 낮아지기 때문에 이 글에서는 위와 같이 /data 아래 있는 패스에 django 패키지를 배치하였다.

마지막 ln 명령어는 django-admin.py 파일을 sshdroid의 실행 경로에 링크한다. (이래야 django-admin.py를 어떤 경로에서든 실행할 수 있다)

 

- django project 생성

위 과정이 다 끝났다면 테스트 삼아 django 프로젝트를 하나 생성하자. 다음 명령을 입력하자:

cd /mnt/sdcard
django-admin.py startproject django_first
cd django_first
python manage.py runserver 0.0.0.0:8000

 

지금까지 잘 진행되었다면 다음과 같은 화면이 나타날 것이다:

 

그러면 브라우저에서 페이지를 로드해 보자:

 

Done! : )