Flask 설치하기

Flask

Flask는 아마도 Pyramid보다도 더 작은 미니멀한 웹 프레임워크로 보인다. 역시나 자세한 설명은 생략한다 홈페이지에서.

설치

eazy_install로 한 방에 할 수도 있는데, 아무래도 가상 환경(virtualenv)을 사용하면 좀 더 깔끔하다. 홈페이지에 소개되어 있는 설치 방법

  • 가상환경은 virtualenv 패키지로 간단히 생성할 수 있다. virtualenv 패키지는 easy_install로 설치할 수 있음
  • c:\> python27\scripts\virtualenv fenv
  • c:\> cd fenv
  • c:\fenv> scripts\activate
  • 이 시점에서 프롬프트가 바뀌고 가상환경이 활성화되었음을 알 수 있다.
  • (fenv) c:\fenv> pip install Flask

다음은 홈페이지에서 소개하고 있는 간단한 예제이다.

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

가상환경이 activate되면 가상 환경을 처음 생성한 버전의 파이썬이 기본으로 실행된다.

(fenv) c:fenv> python hello.py

한 후 http://localhost:5000/ 으로 접속하면 역시 익숙한 문구가 눈에 보일 것이다.

Sqlite3 모듈의 기본 사용법

간단한 예제로 sqlite3 모듈을 사용해서 데이터베이스를 조작하는 방법을 살펴보자.

파이썬은 sqlite3 데이터베이스를 사용할 수 있도록 sqlite3 모듈을 내장하고 있다. 기본적인 사용 순서는 다음과 같다.

  1. sqlite3.connect()를 사용해서 데이터베이스 파일을 열고 연결한다. connection 객체가 생성되며, 이를 통해 쿼리를 전달할 수 있다.
  2. connection.execute()를 사용해서 쿼리를 전송하고 실행할 수 있다.
  3. execute()의 결과로 cursor 객체를 얻게 되는데, 이 객체를 사용해서 영향을 받은 row의 수를 확인하거나, SELECT 문의 경우 각각의 row를 읽어올 수 있다.
더 보기

윈도 시스템에 Pyramid 설치하기

윈도 시스템에 Pyramid 설치하기

Pyramid란?

Pyramid는 파이썬기반의 경량 프레임워크이다. 자세한 설명은 생략한다. 링크를 참조하자. Pyramid

설치

준비물

Pyramid를 설치하려면 다음의 내용들이 필요하다.

  • Python 2.7 혹은 3.0
  • pywin32 – 설치되어 있는 파이썬 버전과 동일한 버전을 설치해야 한다. 다운로드는 sourceforge에서 내려받을 수 있다.
  • easy_install – 파이썬 패키지를 자동으로 내려받을 수 있도록 하는 도구. 없다면 ez_setup.py를 내려받아 python ez_setup.py 로 설치하면 된다.
  • virtualenv

설치 순서 (python 2.7/3.2)

  1. virtualenv를 설치한다. c:\> c:\python27\scripts\easy_install virtualenv
  2. 가상 환경을 만들어 준다 c:\> c:\python27\scripts\virtualenv --no-site-packages env
  3. 가상 환경 디렉토리로 이동 c:\> cd env
  4. 이 위치에서 Pyramid를 설치한다. c:\env\> c:\python27\script\easy_install pyramid

버전에 따른 차이는 pywin32의 버전만 동일하게 맞추면 된다. 또한 만약 여러 버전이 설치된 시스템에서는 각 버전에 맞게 따로 따로 가상환경을 만들고 설치한다.

Pyramid 예제 실행

가상환경에서의 파이썬 인터프리터는 c:\env\scripts 에 위치해 있다. Pyramid를 사용하는 파일을 작성한 후에는 c:\env\scripts\python 파일.py로 실행한다.

다음은 Pyramid 홈페이지에 나와있는 간략한 코드.

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('Hello %(name)s!' % request.matchdict)

if __name__ == '__main__':
    config = Configurator()
    config.add_route('hello', '/hello/{name}')
    config.add_view(hello_world, route_name='hello')
    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

실행시에는 c:\env\scripts\python sample.py로 실행한 후 웹 브라우저로 localhost:8080/hello/ 로 접속하면 낯익은 문구가 반겨줄 것이다.

[Python101] Iterable(3) – 튜플

튜플(tuple)은 ‘한 벌’의 의미로 의미상으로는 가장 원시적인 배열이다. 튜플 한 번 만들어지고 나면 수정이 불가능한 집합이다. 쉽게 말해서 리스트를 ‘얼리면’ 튜플이 된다.

튜플을 만드는 법

리스트를 정의할 때는 대괄호에 원소들을 써서 생성했다. 튜플의 경우에는 괄호에 원소들을 써서 만들 수 있다. 아래의 b는 터플이다.

a = [1, 2, 3, 4]
b = (1, 2, 3, 4)

터플의 원소는 리스트와 마찬가지의 방법으로 접근할 수 있다. 터플 이름 뒤에 대괄호를 쓰고 그 속에 인덱스를 넣으면 된다.

b[2] # --> 3
b[:2] # --> (1, 2)

재밌는 사실 하나. 원소가 하나 밖에 없는 튜플을 만드려면 어떻게 해야할까? (1)이라고 쓰면 이는 수식 자체로 숫자 1과 아무런 차이가 없다. 대신 (1, ) 이라고 쓰면 이는 숫자 1을 원소로 갖는 튜플이 된다.

튜플의 메소드

튜플은 count, index의 두 개의 메소드만 제공한다. 튜플의 특정한 원소를 변경하거나, append, remove, pop, insert 등의 기능은 수행할 수 없다.

그러면 이렇게 한정적인 기능만을 수행하는 튜플을 왜 사용할까? 리스트의 경우 한 번 만들어진 이후에 변경이 가능한 점 때문에 처리하는 데 ‘속도’가 느려질 수 있다. 매우 큰 집합을 포함하는 리스트의 중간에 새로운 원소를 끼워넣거나, 중간에 있는 특정한 원소를 제거하는 것은 제아무리 빠른 컴퓨터라할지라도 꽤나 피곤한 일인 것이다. 이런 “변경 가능한 특성” 때문에 리스트는 편리한 대신 처리속도가 느리다. 튜플은 변경 가능한 특성이 없고 오직 고정되어 있는 리스트이기 때문에 원소를 검색하거나 하는 데 시간이 거의 걸리지 않는다.

사실 리스트를 이해하면 튜플은 그냥 이해하고 있는 것과 다름없다. 원소를 변경하거나 정렬하는 등의 동작을 할 수 없지만 그냥 무식하게 빠르다고 생각하면 된다.

길이를 구하거나 정렬하기 – 내장함수의 경우

튜플은 변경과 관련된 메소드를 가지고 있지 않지만, 대신 기본 내장 함수들 sorted(), len()에서는 적용할 수 있다. 즉 (2,5,7,3,4,1,9)와 같은 튜플은 sorted() 함수를 써서 ‘정렬된 리스트’를 얻을 수는 있다.

b = (2,6,3,7,4,1,9)
c = sorted(b)
print c
# --> (1, 2, 3, 4, 6, 7, 9)

튜플의 이름은 역시 자료형인 동시에 튜플로 변환하는 함수이기도 하다. tuple() 함수는 리스트를 얼리거나, 문자열을 쪼개어 터플로 만들어준다.

>>> a = 'attributes'
>>> b = range(0,10,4)
>>> ta = tuple(a)
>>> tb = tuple(b)
>>> ta
# --> ('a', 't', 't', 'r', 'i', 'b', 'u', 't', 'e', 's')
>> > tb
# --> (0, 4, 8)
>>> len(ta)
# --> 10
>>> sorted(ta)
# --> ['a', 'b', 'e', 'i', 'r', 's', 't', 't', 't', 'u']

이제 다음 시간에는 다른 자료형인 ‘사전(dictionary)’에 대해 알아보기로 하겠다. 사전형은 이름이 있는 원소들을 다루는 멋진 자료형이다.

[Python101] Iterable (2) – 리스트 – 2

오늘은 리스트의 다른 활용을 살펴보는 두 번째 시간이다. 지난 강좌 글에서 이번에는 리스트와 문자열을 어떻게 변환하는지 살펴보겠다고 했고, 또 지능형 리스트에 대해서도 알아보기로 했다.

문자열과 리스트

문자열을 리스트로 처리하는 방법은 특히 ‘저장된 데이터들’을 처리하기에 편리하다. 즉 어떤 일련의 데이터를 리스트로 다루다가 이를 파일에 저장할 때는 문자열로 기록한다음, 다시 꺼내서 사용할 때는 다시 리스트로 분리하여 사용할 수 있는 것이다.

문자열을 리스트로, 혹은 그 반대로 사용하는 변환하는 방법은 다음과 같은 것들이 있다.

  • 문자열을 한 글자, 한글자로 쪼개어 리스트로 만든다 : list() 함수
  • 문자열속에 특정한 구분자를 통해 여러개의 문자열로 나누어 리스트로 만든다. : split() 메소드
  • 리스트의 원소들을 문자열로 바꾸어 특정한 구분자를 끼워넣어 결합한다. : join() 메소드

대화형 쉘을 실행하고 다음 명령들을 입력해보자.

>>> a = 'copyright'
>>> b = 'It is not safe to modify the sequence being iterated over in loop."
>>> c = range(0, 50, 3)

>>> a
#--> 'copyright'
>>> la = list(a)
>>> la
#--> ['c','o','p','y','r','i','g','h','t']

>>> lb = b.split('\s')
>>> lb
#--> ['It', 'is', 'not', 'safe', 'to', 'modify', 'the', 'sequence', 'being', 'iterated', 'over', 'in', 'loop.']

>>> d = ','.join(lb)
>>> d
#--> 'It,is,not,safe,to,modify,the,sequence,being,iterated,over,in,loop.'

split()은 문자열의 메소드이다. 이는 인수로 받은 글자를 기준으로 문자열을 쪼개어 리스트로 만들어준다. 즉 위의 예제에서는 긴 문장에 대해 공백문자를 기준으로 분리한다고 했다. 그리고 그 결과는 lb에 대입하였고, lb를 통해서 만들어진 리스트를 확인할 수 있었다.

거꾸로 join() 역시 문자열의 메소드인데, 구분자로 사용할 글자를 주고 이 글자의 join 메소드를 사용하면 리스트의 원소를 다시 결합할 수 있다. d를 통해 이를 확인할 수 있었다.

지능형 리스트

위의 예제에서 c는 왜 만들었을까? 지금까지 보았던 range() 함수의 사용과는 조금 색다른데가 있다. 즉 시작값, 끝값 그 뒤에 뭔가 추가적인 인수를 더 썼다. 궁금증은 help를 통해 알아보면 된다. help(range) 라고 하면 아래와 같이 설명을 볼 수 있는데,

Help on built-in function range in module __builtin__:

range(...)
    range([start,] stop[, step]) -> list of integers

    Return a list containing an arithmetic progression of integers.
    range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
    When step is given, it specifies the increment (or decrement).
    For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
    These are exactly the valid indices for a list of 4 elements.

range( [start], stop [, step]) 이라고 되어 있다. 즉 시작값과 끝값, 그리고 그 다음은 “간격”이다. 그리고 중요한 것 하나. 이렇게 함수 도움말에서 인자에 [대괄호]로 묶은 부분이 있다면 이 값은 필수가 아니라는 점이다. range() 함수에서는 오직 stop 만이 필수로 들어가는 값이다.

즉 함수가 인자로 받는 인수의 개수가 동적으로 바뀔 수 있다는 점인데, 이는 다른 언어에서는 허용하지 않는 경우가 많다. 이는 파이썬의 유연성을 높이는 굉장히 멋진 기능이다!

어쨌든 위의 예제에서 c는 0에서 시작하여 50보다 작은 3의 배수들을 모두 모아보았다. 이 들을 그냥 0, 1, 2, 3…  이런 식으로 다시 만들 수 있을까? 다음과 같은 코드를 생각해 볼 수 있다.

f = []
for x in c:
   f.append(x/3)

즉 c의 각 원소 x에 대해서 3으로 나눈 다음 그 결과를 f에 하나씩 밀어넣으면 된다. f 값을 확인해보면 결과를 확인해볼 수 있다.

그런데 이런 처리는 의외로 파이썬에서 종종 쓰인다. 그래서 파이썬은 ‘지능형 리스트’라는 걸 사용하는데 다음과 같이 사용한다.

[ {변수명}을 사용하는 서식 for {변수명} in {리스트명} ]

즉 f는 위의 코드가 아닌 단 한줄의 코드로 정리할 수 있다.

f = [num/3 for num in c]

지능형 리스트는 자주 쓰이지 않는 리스트 변환 작업을 따로 함수로 빼지 않고 다른 구문 내에서 간단히 처리하고자 할 때 쓰인다. 사실 지능형 리스트의 활용 방법은 조금 더 있지만, 그건 나중에 필요할 때 다시 언급하기로 하고, 여기서는 간단히 이런게 있다는 것만 설명하고 넘어가도록 하자.