用户工具

站点工具


python_notes

Python 笔记

Resource

Python Imaging Library (PIL)

wxPython

配置 Apache + mod_wsgi + web.py

Mac OS Mountain Lion (10.8)

可以使用 brew 安装 mod_wsgi:

brew tap homebrew/apache
brew install mod_wsgi

有可能在编译 mod_wsgi 的时候会遇到如下错误:

env: /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.8.xctoolchain/usr/bin/cc: No such file or directory
apxs:Error: Command failed with rc=65536

可以通过如下方法修复:

sudo ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.8.xctoolchain

也可以以编译 mod_wsgi 源代码的方式进行安装,只是稍微麻烦了一点。

之后需要修改 Apache 的配置文件:

LoadModule wsgi_module /usr/local/Cellar/mod_wsgi/3.4/libexec/mod_wsgi.so
AddHandler wsgi-script .py
# 下面这句不加的话,浏览器会直接显示出 HTML 源代码,而不是渲染 HTML
AddType text/html .py

安装 web.py:

sudo easy_install web.py

一个最简单的 mod_wsgi + web.py 的例子:

import web
 
urls = (
	'/.*', 'hello',
	)
 
class hello:
	def GET( self ):
		return "Hello, world."
 
app = web.application( urls, globals() )
application = app.wsgifunc()

假如如上代码保存并命名为 test.py,那么访问它的方式是 http://localhost/~username/test.py/(注意最后的 /,web.py 有自己内部的路由系统)。

如果不想暴露源代码的名字的话,可以在 Apache 配置文件中做如下设置:

WSGIScriptAlias /test /Users/username/Sites/test.py/
Alias /test/images /Users/username/Sites/images/

之后就可以直接用 http://localhost/test 来访问了。

也可以让 web.py 自己作为 web server 来运行,这样可以不安装 Apache 跟 mod_wsgi,只需要把上面 code 做如下修改:

if __name__ == '__main__' :  # 必须这么做,否则会遇到错误:No socket could be created
    app = web.application( urls, globals() )
    app.run()

然后运行:

python test.py

之后访问 http://localhost:8080 即可,如果想换到 9090 端口则用如下命令:

python test.py 9090

安装 Mako(http://www.makotemplates.org/):

sudo easy_install Mako

pip

如果有 easy_install 的话:

easy_install pip

没有的话,下载 https://raw.github.com/pypa/pip/master/contrib/get-pip.py,然后:

python get-pip.py

flask

RE

匹配分组

import re
 
pattern = r'(\d+)\.(\d+)\.(\d+)\.(\d+)'
po = re.compile( pattern )      # Genarate pattern object
mo = po.match( '192.168.0.1' )  # Generate match object if success
if mo:
	print mo.groups()    # ('192', '168', '0', '1')
	print mo.group( 0 )  # 192.168.0.1
	print mo.group( 1 )  # 192
	print mo.group( 2 )  # 168
	print mo.group( 3 )  # 0
	print mo.group( 4 )  # 1
	print mo.group( 5 )  # Error: IndexError
import re
 
po = re.compile( 'xx(YY)xx' )
list = po.findall( data )
print( list )

urllib2

获取 HTTP 回应包的 header

import urllib2
 
request = urllib2.Request( 'http://www.google.com' )
request.add_header( 'User-agent', 'xxx' )
f = urllib2.urlopen( request )
print( f.headers['Date'] )
f.close()

下载文件

remotefile = urllib2.urlopen( url )
localFile = open( 'download', 'wb' )
localFile.write( remotefile.read() )
localFile.close()
remotefile.close()

上传文件

上传文件可以用开源 Python 库 poster 实现:https://pypi.python.org/pypi/poster/

from poster.encode import MultipartParam
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
 
register_openers()
 
datagen, headers = multipart_encode( { 'file' : open( 'test.png', 'rb' ), 'comment' : 'test' } )
request = urllib2.Request( 'http://test.com/upload.php', datagen, headers )
urllib2.urlopen( request )

如果需要指定上传文件的 MIME Type:

register_openers()
 
img          = MultipartParam.from_file( 'file', 'test.png' )
img.filetype = 'application/octet-stream'
comment      = MultipartParam( 'comment', 'test' )
 
datagen, headers = multipart_encode( [ img, comment ] )
request = urllib2.Request( 'http://test.com/upload.php', datagen, headers )
urllib2.urlopen( request )

hashlib

md5 跟 sha lib 都已经不再建议使用,现在做哈希要用 hashlib。

import hashlib
 
print( hashlib.sha1( 'test' ).hexdigest() )
print( hashlib.md5( 'test' ).hexdigest() )

Misc

参数

sys.argv 返回参数列表,第一个 item 总是脚本自己。不过取自己的绝对路径还是用 __file__ 稳妥。

判断是否被其它脚本 import

if __name__ != '__main__':
	print 'used by import'

字符串编码转换

a = 'test'
b = a.encode( 'utf-8' )  # ASCII to UTF-8
a = b.encode( 'ascii' )  # UTF-8 to ASCII

显示当前时间

import time
print( time.strftime( '%H:%M:%S' ) )

切分可能混合了 DOS、Linux 和 Mac 换行符的数据

po = re.compile( '\r\n|\n|\r' )  # Process DOS, *nix and Mac line break
lines = po.split( data )
 
# 下面再转成 DOS 格式
for i in range( 0, len( lines ) - 1 ):
	lines[i] += '\r\n'
if '' == lines[-1]:
	del lines[-1]

做 URL 编码

比如把 foo@bar.com 转换成 foo%40bar.com:

import urllib
print( urllib.quote( 'foo@bar.com' ) )
python_notes.txt · 最后更改: 2014/03/08 15:58 由 2ndboy