Tag: python

python 한 줄로 웹서버 만들기..

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

딱.. 한줄이지만.. 정작 필요할 때는 기억이 안나서.


twisted powered http proxy server

역시 간단한 서버 작업 하는 데는 twisted 만한 것이 없습니다.

from twisted.web import proxy, http
from twisted.internet import reactor
from twisted.python import log
import sys

log.startLogging(sys.stdout)

class ProxyFactory(http.HTTPFactory):
    protocol = proxy.Proxy

reactor.listenTCP(8080, ProxyFactory())
reactor.run()

Python 2.7 Release Note를 보다가..

http://docs.python.org/dev/whatsnew/2.7.html#pep-372-adding-an-ordered-dictionary-to-collections
순서가 보장되는 딕셔너리.. 그래 이거 필요했다. 특히 json으로 넒길때 아무리 순서가 없다지만. .그래도 순서 있는게 좋지 않겠어?

http://docs.python.org/dev/whatsnew/2.7.html#pep-378-format-specifier-for-thousands-separator
format()이란것을 통해서 해야된다는 것이 불편하긴 하지만... 그래도 locale 모듈을 통해서 한다는 것에 비하면, 천지차이라고나 할까?

http://docs.python.org/dev/whatsnew/2.7.html#pep-3106-dictionary-views
그래 이것도 맞는 것 같다... key를 iteration하면서 그 리스트를 수정하는 경우.. 뭔가 애매한 부분이 있었었지...

아래건... 실수할 가능성이 많아진 문법인듯..

>>> {1,2,3,4,5}
set([1, 2, 3, 4, 5])
>>> set() # empty set
set([])
>>> {}    # empty dict
{}

http://docs.python.org/dev/library/io.html#module-io
cStringIO 보단 그냥 io 써야겠다.. C로 작성되어 2~20배 빨라졌다고 함... 근데 편차가 왜이리 큰겨?
http://docs.python.org/dev/library/shutil.html#shutil.make_archive
간단한 압축엔 유용하겠는걸...


mako expression filtering, decorator

http://www.makotemplates.org/docs/filtering.html#expression-filtering

  • u : URL escaping, provided by urllib.quote_plus(string.encode('utf-8'))
  • h : HTML escaping, provided by markupsafe.escape(string) (new as of 0.3.4 - prior versions use cgi.escape(string, True))
  • x : XML escaping
  • trim : whitespace trimming, provided by string.strip()
  • entity : produces HTML entity references for applicable strings, derived from htmlentitydefs
  • unicode (str on Python 3): produces a Python unicode string (this function is applied by default).
  • decode.<some encoding> : decode input into a Python unicode with the specified encoding
  • n : disable all default filtering; only filters specified in the local expression tag will be applied.

필터는 그냥 스트링 인자를 하나 받는 함수이므로 작성하기도 편하다.

그런데 아쉽게도 필더에 파라미터가 들어가지 않는구나..

http://www.makotemplates.org/docs/filtering.html#decorating

mako의 함수에 python의 decorator처럼 사용할 수 있다. 멋진데?


파라미터가 있는 decorator

Python의 Decorator 기능은 한마디로 멋지다. 잘 쓰면 유용하지... 근데 작성하면 항상 헷갈린단 말이지...

decorator에 파라미터를 넘겨주고자 하는 경우에도 상당히 헷갈린다. 파라미터가 없는 것하고 형태가 아주 또 달라지거든.. 간단히 기억하자 파라미터가 있는 데코레이터는 wrapp 함수를 한번 더 두어야한다는 것..

def prefix_decorator(func):
        def new_func(*args, **kwargs):
                return 'prefix: ' + func(*args, **kwargs)
        return new_func

def my_decorator(str):
        def wrap(func):
                def new_func(*args, **kwargs):
                        return func(*args, **kwargs) + ' :' + str
                return new_func

        return wrap

@prefix_decorator
@my_decorator('added by decorator')
def test():
        return "I'm test"

print test()

실행 결과는 아래와 같음..

prefix: I'm test :added by decorator

python-mcrypt 사용 예

python-mcrypt은 문서가 없다. 포함된 test.py를 보면 되는데... 좀 길고..

#! -*- encoding: utf8 -*-
import base64
import urllib
import mcrypt
import random
import string

def random_string(length):
        return ''.join([random.choice(string.ascii_letters + string.digits) for x in range(length)])

chiper_key = random_string(16)

# encode
def encrypt(data):
        m = mcrypt.MCRYPT('rijndael-256', 'cfb')
        iv_size = m.get_iv_size()
        iv = random_string(iv_size)

        m.init(chiper_key, iv)
        return base64.b64encode(m.encrypt(iv + data))


# decode
def decrypt(data):
        data = base64.b64decode(data)
        m = mcrypt.MCRYPT('rijndael-256', 'cfb')
        iv_size = m.get_iv_size()
        iv = data[:iv_size]
        encrypted = data[iv_size:]
        m.init(chiper_key, iv)
        return m.decrypt(encrypted)

data = '안녕하세요'
assert data == decrypt(encrypt(data))

cannot write mode P as JPEG

PIL로 이미지 썸내일 만드는데... 이런 에러가...

http://www.errorhelp.com/search/details/80884/ioerror-cannot-write-mode-p-as-jpeg

간단하다.. P 모드가 아닌 RGB 모드로..


GeoIP python

http://www.pointlessrants.com/2010/05/python-geoip-python-geoip-cities-tutorial/

import GeoIP
import socket

host = 'www.daum.net'

gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)
print socket.gethostbyname(host), gi.country_code_by_name(host),

gi = GeoIP.open('GeoLiteCity.dat', GeoIP.GEOIP_STANDARD)
city = gi.record_by_name(host)
if city:
    print city['city'], city['region_name']

Python 함수에서 static 변수처럼 사용하기…

class에서는 static 변수가 지원됩니다. 그런데 함수에서 가끔 static이 필요할 때가 있습니다.

static을 사용하지 않는다면, global을 써야하는데, global을 사용한다는 것은 항상 꺼려지는 것이기에 static이 권장되죠. 하지만 python은 함수에 static을 지원하지 않고, 비슷하게 이를 흉내낼 수 있습니다.

_static을 잘 보시면 됩니다. 자세한 내용은 생략 ㅋㅋ

def get_connection(_static = {}):
    if 'conn' not in _static:
        conn = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASS, db=DB_NAME, use_unicode=True, charset='utf8')
        _static['conn'] = conn
    return _static['conn']

def get_cursor():
    return get_connection().cursor()

psycopg2 쿼리 결과를 유니코드로 받기

psycopg2에서 쿼리의 결과는 client_encoding에 따른 그 형태 그대로 옮니다. 이 경우 인코딩을 처리하면서 해야하면 상당한 불편함이 따르지요.

무식하게 하나하나 unicode(row[0], 'utf8')로 인코딩해가면서 하고 있었습니다. 진짜 무식하게..

근데 설마 있겠지.. 하고 찾아봤더니 역시나 있군요.

import psycopg2
from lib import *

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
cursor = get_cursor()
cursor.execute('select subject from messages order by id desc limit 1')

for row in cursor:
    print type(row[0])

실행 결과는...

$ python test.py
<type 'unicode'>

역시.. 사람은 공부해야 손발이 고생하지 않는다.


  • Copyright © 1996-2010 Your wish is my command. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress