2015년 8월 25일 화요일

[web2py] web2py 설치 및 실행

< Web2py 시작하기 >

1. Web2py 설치

web2py 사이트에서 소스코드 다운로드 링크를 복사해서 wget으로 다운받는다.
$sudo wget http://www.web2py.com/examples/static/web2py_src.zip

2. Web2py 실행

리눅스용 web2py는 설치가 아니고 단지 압축만 풀어주면 된다.
$sudo unzip web2py_src.zip
압축이 풀린 폴더에 들어가서 web2py를 실행시킨다.
$cd web2py  
$sudo python web2py.py

3. 원격 PC의 Web Browser에서 Web2py Admin Page 접속하기

(출처 : http://stackoverflow.com/questions/12834550/simplest-way-to-setup-remote-admin-access-to-a-web2py-process)
Web2py의 Admin Page는 로컬에서 접속하거나 Https를 통해서만 접근할 수 있다.
그래서 다른 컴퓨터의 Web Browser를 통해서 Web2py의 웹서버에 있는 웹페이지는 접근이 되지만 Admin 페이지는 접근할 수 없어서 원격 PC에서 Web2py를 설정할 수 없다.
이러한 문제를 해결하기 위해서 SSL 인증서를 Web2py 서버에 추가하는 방법을 사용한다.
간단한 방법은 아래와 같다.(여기서 설명하는 방법은 개발할때만 사용하고 실제 상용될때는 사용하면 안된다.)
(1) 이미 가지고 있는 인증서가 없다면 새로운 인증서를 만든다.(임의의 폴더에서 수행해도 무방하다.)
$openssl genrsa -out server.key 2048
$openssl req -new -key server.key -out server.csr
$openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
두번째 명령을 수행할때 인증서에 들어갈 정보를 입력하라고 한다. 아래 사진과 같은 정보를 요구한다.
(2) 위의 과정을 수행하고 나면 3개의 파일이 생기는데 그중 server.key파일과 server.crt파일을 web2py의 루트폴더에 복사한다.
(3) 그리고 web2py를 실행시킬 때 아래와 같이 실행한다.
$sudo python web2py.py -i (자신의 ip주소) -p 8000 -a '(원하는 비밀번호)' -c server.crt -k server.key
(4) 이제 아래와 같은 주소로 원격 PC의 Web Browser에서 웹페이지에 접근한다.(https 가 중요하다.)
https://(web2py 실행시 입력한 ip주소):8000
헌데 브라우저에서 인증서를 의심하여 접속을 막을 수 있다. 어차피 내가 만든 인증서이니 믿고 그냥 들어가도록한다.
위 주소에서 Admin Page로 들어가면 정상적으로 들어가진다.

4. 여러 ip로 접근 가능하게 하기.

web2py는 여러개의 ip를 이용하여 웹서버에 접속하게 할 수 있다.
위에서 처럼 하면 -i 옵션 뒤에 한 ip주소만 쓸 수 있지만 --interfaces 옵션을 이용하면 여러개의 ip를 지정할 수 있다.
$sudo python web2py.py --interfaces "ip1:port1;ip2:port2;..." -a '(원하는 비밀번호)'
위의 예시처럼 하면 ip1과 ip2 두 경로로 웹서버에 접속 할 수 있다.
그렇다면, admin 접속을 위한 ssl 인증서는 어떻게 할까? 그건 아래 예시처럼 하면 된다.
$sudo python web2py.py --interfaces "ip1:port1:key:crt;ip2:port2;..." -a '(원하는 비밀번호)'
위의 예시처럼 하면 ip1과 ip2 두 경로로 웹서버에 접속 할 수는 있지만, admin페이지는 ip1으로 접속해야만 접근할 수 있다. 이 경우에 ip2에 대해서는 ssl인증서를 입력하지 않았으므로 ip2는 https 가 아니라 http 로 입력해야한다.

2015년 8월 23일 일요일

[web2py] URL 함수 이용하기.

[web2py] URL 함수 이용하기.


web2py의 장점중 하나는 Restful 방식이 쉽게 구현된다는 것이다.
무슨말인즉슨, URL형태로 웹서버의 함수를 콜하면 함수가 동작하고 그에 대한 반환값을 반환한다는 것이다.

예를 들어서 웹서버에 ABC() 라는 함수가 있고 이 함수가 수행되면 "abc"라는 문자열을 반환한다고 치자.
이 경우에 web2py는 간단하게

    http://웹서버주소/[application name]/[controller]/[function]

을 치면 함수의 반환값인 "abc"가 넘어온다. 웹브라우저에서 수행하면 반환값이 화면에 출력될 것이다.

이렇게 주소를 쳐서 반환값을 받는 작업을 php등의 다른 언어를 사용하면 구현이 바로 되거나 쉽지는 않을것이다.


web2py 내부 python코드에서는 URL 함수를 이용하면 더 편리하게 Restfaul 방식을 사용할 수 있다.
URL 함수를 설명하는 문서의 주소는 아래와 같다.
http://web2py.com/books/default/chapter/29/04/the-core#URL

기본적으로

    URL([application name],[controller name],[function name] (, args=[x,y] , vars=dict(z='t')))

처럼 간단하게 쓸수 있다.

뿐만 아니라 그림파일 등의 고정적인 파일도 static 폴더에 넣어 놓으면 간단하게 호출해 올 수 있다.

나도 아직 URL의 다양한 형태를 사용해보진 못했지만 문서에서도 web2py의 중요한 한 기능이라고 설명할 만큼 중요하고 좋은 기능이니 앞으로 많이 써보면서 정리해야 겠다.

2015년 8월 21일 금요일

[web2py] logging 모듈 사용하기.

[web2py] logging 모듈 사용하기.


처음엔 조금씩 쓰다가 web2py의 cron을 사용하면서 부터 cron에서 무슨 일이 일어나는지 알기 위해서 logging 모듈을 많이 사용하고 있다.
그럴때마다 logging모듈을 제대로 설명하고 있는 아래 사이트를 자주 참고한다.

http://www.hanbit.co.kr/network/view.html?bi_id=1979

2015년 8월 20일 목요일

[web2py] unindent does not match any outer indentation level

[web2py] unindent does not match any outer indentation level


web2py로 python코드 짜는데 코드가 정말 문제가 없는데 아래 에러가 뜨더라..

unindent does not match any outer indentation level

꽤 오래 헤맷는데 알고보니 들여쓰기 할때 space랑 tab이랑 혼용해서 사용해서 그런거라고 한다...끙...web2py는 자동 들여쓰기되면 space 4칸으로 되는데 내 코드에 tab이 껴있어서 에러가 났던 거였다.
Tab을 제거하니깐 에러가 사라졌다.

[web2py] dropdown으로 표시되는 sqlform만들기

[web2py] dropdown으로 표시되는 sqlform만들기


web2py에서 기본 input form의 형태는 그냥 text를 입력할 수 있는 textfield이다.
헌데 나는 아래 그림처럼 화살표를 누르면 목록으로 보이는 input form을 만들고 싶었다.





예전에도 시도하다가 안되서 포기 했었는데 이번에는 포기하고 싶지 않았다.
sqlform이다 보니 DB랑 연결되는 것이고 알아보다보니 db에서 Table을 생성할때 Field의 속성에서 requires에 IS_IN_SET또는 IS_IN_DB를 사용하면 select box(dropdown)이 나온다는데 나는 어찌해도 안나오더라...하루종일 이것저것 해도 안되는....ㅠㅠ

그런데 너무 간단하게 해결했다.

기존에는 내가 계속 시도할때

db.define_table([Table 이름],
                     Field([Field이름], requires=IS_IN_SET([넣고 싶은 목록]))

의 형태로, requires를 Field를 설정하는 곳 안에 넣었었다.
그러다가 web2py.com/books 에서 requires를 Field 설정부분 말고 따로 아래에서 설정해주는 예시가 있길래 해봤는데 dropdown이 나왔다!!!!


db.define_table([Table 이름],
                     Field([Field이름]))
db.[Table 이름].[Field이름].requires=IS_IN_SET([넣고 싶은 목록])

이렇게 하니깐 맨위 이미지처럼 나오더라..감격!
web2py는 언제나 한국어 자료가 너무 없다...내가 겪는 이 문제들은 다른 한국인은 겪지 않기를...

2015년 8월 18일 화요일

[web2py] modules에서 db 객체 사용하기

Modules에 있는 python 코드에서 web2py의 db 객체 사용하기.


web2py의 modules에 구현해 놓은 코드에서 web2py의 db에 접근할 일이 생겨서 db객체가 어디서나 쓸 수 있는지 알고 그냥 바로 썼는데 동작을 못하더라...
처음엔 어디가 문제인지도 모르다가 수차례 디버그 로그를 찍어보다가 db가 문제인 것을 찾았다.

modules의 python코드에서 db등의 web2py 전역 변수들(request, response 등)을 사용하려면 current 모듈을 import 해야한다.
db의 경우에는 current.db에 web2py의 db를 담아서 modules에서 사용하더라.
즉, 아래와 같은 작업이 필요하다.

(1) model의 db.py에 자신이 사용할 db를 생성한 부분에서 아래 코드 처럼 current.db를 만들어준다. (빨간 부분이 추가해줘야할 부분이다.)

    from gluon import current
    db = DAL('sqlite://webform.sqlite')
    current.db = db

(2) db를 사용할 modules의 코드에 가서 current를 import하고 current.db를 받아온다.

    from gluon import current
    ...
    (db를 사용할 함수 내에서)
    db = current.db

이렇게 하면이제 modules의 코드에 있는 함수에서 db를 접근할 수 있다.

정확한 current에 대한 설명은 web2py books에서 확인할 수 있다.
http://web2py.com/books/default/chapter/29/04/the-core?search=current#Accessing-the-API-from-Python-modules

2015년 8월 12일 수요일

[web2py] cron 사용하기

web2py의 cron 기능 사용하기!


라즈베리파이에서 web2py를 이용한 웹서버/DB서버를 만들고 DB에 값을 삽입/삭제/수정/확인 할 수 있는 페이지를 만든 다음, 별도의 python 프로그램에서 web2py로 만든 웹페이지 코드를 긁어와서 DB값을 읽어오게 하고 있었다.

이렇게 한 이유는,
web2py에 python 프로그램 코드를 그대로 넣어도(조금 수정을 해야겠지만) 코드가 동작하는데 해당 코드가 돌기 위해서는 결정적으로 코드가 작성된 웹페이지가 브라우저에서 호출이 한번은 되야 실행이 되기 때문이었다.

내가 만드는 python 프로그램은 웹페이지의 정보를 이용 하긴 하지만, 웹페이지가 호출되지 않아도 실행되어야했다.
그래서 프로그램과 web2py가 동일하게 python으로 작성됨에도 불구하고 별도로 개발하고 있었다.

하지만 web2py의 cron이라는 기능을 알게되어 python프로그램은 web2py로 합칠 수 있었다.
cron은 web2py가 실행되는 동안 주기적 또는 실행되는 최초에 원하는 Function또는 .py파일을 백그라운드에서 실행 시킬 수 있는 기능이다.

그 사용법은 다음과 같다.
(1) web2py가 설치된 폴더에 applications폴더가 있다. 거기에는 사용자가 만든 app폴더가 있고 그 폴더 안에 cron 폴더가 있다.
        ..../web2py/applications/[app name]/cron
cron폴더 안에는 crontab 이라는 파일이 있는데 이 파일에 백그라운드에서 실행시키고 싶은 Function또는 .py파일을 적어주면 된다.
        $sudo nano crontab

적어주는 양식 예제는 아래 링크에 있다.
http://web2py.com/books/default/chapter/29/04/the-core?search=Running+tasks+in+the+background#Cron

근데 예제에는 Function 경로를 어떻게 적어줘야하는지 설명이 부족해서 헤매다가 여러가지 해보고 알아냈다.
        @reboot  root *[Function이 위치한 controllers의 파일이름]/[Function 이름]
예를 들어 기본적으로 있는 controllers의 파일인 dafault.py의 index() 함수를 등록하려고 하면
        @reboot  root *default/index
라고 하면된다.
Function이 아닌 .py 파일을 등록하고 싶을때는 web2py 폴더에 있는 applications 폴더부터 경로를 적어주면 된다. .py 파일은 cron폴더 내에 작성하는 것이 기본인듯 하다.
        @reboot  root *applications/[app name]/cron/[파일명]

참고로 reboot은 web2py가 실행되는 최초에 한번만 수행된다는 뜻이다.

(2) crontab 파일을 변경하였으면 web2py를 실행할때 반드시 --run-cron 옵션을 달아줘야 한다.






2015년 8월 9일 일요일

시작!

시작!


2015년 8월 9일 일요일.
새로운 마음으로 블로그를 다시 시작한다.
이곳에는 앞으로 나의 생각과 경험과 이야기를 적어갈 것이다.

찬민이의 세상에 오신걸 환영합니다.