Python Web.py框架实现的简易REST服务原型

Posted by & filed under Programming.

Web.py是python web框架中比较轻量级的,只实现了一些必要的组件,个人比较喜欢这样的框架,虽然功能并不完整,在我所做过的项目中,实际上并没有一款框架能够适合,或许是因为电子商务领域特殊性,也或许是因为公司太大,依赖的东西更多,直接导致了任何一款框架拿过来,写着写着就需要动框架本身的东西,不动它就实现不了业务,由于这个原因,我更偏爱简洁、轻量的框架,修改起来方便,至于组件,既然别的框架已经实现了,拿来改改就能用上了。当然,如果只是普通的CMS之类的开发,没有很多复杂的业务,我更推荐各位使用功能丰富,大而全的框架,比如Rails,比如Django,或者PHP里的很多类似的框架,可以省不少时间,至少分页类不用自己搞了。在复杂的项目中,这些时间是不能省的,否则会导致日后业务的灾难性后果或者需要更多的时间去修改框架。 废话多了,关于web.py可以参考官方网站,中文的入门文档也很全,写起来非常的简单,基本上不用改什么就可以迁移到Google App Engine上。下面上代码: import web import json from mimerender import mimerender   render_xml = lambda message: ‘<message>%s</message>’%message render_json = lambda **args: json.dumps(args) render_html = lambda message: ‘<html><body>%s</body></html>’%message render_txt = lambda message: message   urls = ( ‘/(.*)’, ‘greet’ ) app = web.application(urls, globals())   class greet: @mimerender( default = ‘html’, html = render_html,… Read more »

XAMPP集成环境中安装PHPUnit

Posted by & filed under Programming.

PHPUnit是一个轻量级的PHP测试框架。它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计)。单元测试是几个现代敏捷开发方法的基础,使得PHPUnit成为许多大型PHP项目的关键工具。这个工具也可以被Xdebug扩展用来生成代码覆盖率报告 ,并且可以与phing集成来自动测试,最后它还可以和Selenium整合来完成大型的自动化集成测试。 Windows平台LAMP环境XAMPP 1.7.3下如何安装PHPUnit呢? 首先,以管理员身份运行cmd,使用pear添加phpunit频道: D:\xampp\php>pear channel-discover pear.phpunit.de Channel “pear.phpunit.de” is already initialized 频道添加好,尝试安装PHPUnit: D:\xampp\php>pear install phpunit/PHPUnit Unknown remote channel: pear.symfony-project.com Unknown remote channel: pear.symfony-project.com Unknown remote channel: components.ez.no Unknown remote channel: components.ez.no phpunit/PHPUnit requires PEAR Installer (version >= 1.9.1), installed version is 1.9.0 phpunit/PHPUnit requires package “channel://pear.symfony-project.com/YAML” (version >= 1.0.2) phpunit/PHPUnit can optionally… Read more »

Python PIL 生成带阴影的缩略图

Posted by & filed under Programming.

iimport sys from PIL import Image, ImageFilter   def dropShadow( image, offset=(5,5), background=0xffffff, shadow=0×444444, border=8, iterations=3): """ 把图像放在一个作了高斯模糊的背景上   image – 要放在背景上的原始图像 offset – 阴影相对图像的偏移,用(x,y)表示,可以为正数或者负数 background – 背景色 shadow – 阴影色 border – 图像边框,必须足够用来制作阴影模糊 iterations – 过滤器处理次数,次数越多越模糊,当然处理过程也越慢 """   # 创建背景块 totalWidth = image.size[0] + abs(offset[0]) + 2*border totalHeight = image.size[1] + abs(offset[1]) + 2*border… Read more »

Python 批量生成缩略图

Posted by & filed under Programming.

首先上代码 # coding=utf-8   import os import Image   # 字义缩放百分比 rate = 40   # 缩略图命名,在后面加上 resizedAddone = ‘_resized’   # 支持格式 suportFormat = [’bmp’, ‘gif’, ‘jpg’, ‘png’]   def process(arg, dirs, files): for file in files: fileExt = os.path.splitext(file)[1].lower()[1:] if fileExt in suportFormat: img = Image.open(file) img.thumbnail((img.size[0] * rate / 100, img.size[1] *… Read more »

Httpsqs Python Client

Posted by & filed under Programming.

Httpsqs 是张宴基于Tokyo Cabinet做的一个队列服务 前些日子项目中需要一个队列服务,因为配合Gearman做分发服务,因为之前的一些经历和教训,没有采用PHP作为脚本语言,当然并不是说PHP不行,只是懒得去折腾一些莫名其妙的问题,转而采用在更稳定更省心的Python做开发,之前其他的项目组中有使用Httpsqs的经历,我的leader强烈建议我使用这个,其实我更倾向memcacheQ 或者redis,Httpsqs没有Python版本的client,顺手写了一个,地址如下: http://code.google.com/p/httpsqs/source/browse/#svn%2Ftrunk%2Fclient%2Fpython 这个玩意是能正常的跑在我的项目中,不能保证能完全满足你的需求,如果你有任何建议或者意见,也欢迎联系我,特别附加一句:本人对此代码所带来的一切悲剧或者喜剧不承担任何责任,请慎重使用! 贴一段关于httpsqs的介绍,怕有些人不知道,知道的请忽略。 TTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储。   项目网址:http://code.google.com/p/httpsqs/   使用文档:http://blog.s135.com/httpsqs/   使用环境:Linux(同时支持32位、64位操作系统,推荐使用64位操作系统)   软件作者:张宴   队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。利用消息队列可以很好地异步处理数据传送和存储,当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取消息队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。   HTTPSQS 具有以下特征:   ● 非常简单,基于 HTTP GET/POST 协议。PHP、Java、Perl、Shell、Python、Ruby等支持HTTP协议的编程语言均可调用。   ● 非常快速,入队列、出队列速度超过10000次/秒。   ● 高并发,支持上万的并发连接,C10K不成问题。   ● 支持多队列。   ● 单个队列支持的最大队列数量高达10亿条。   ● 低内存消耗,海量数据存储,存储几十GB的数据只需不到100MB的物理内存缓冲区。   ● 可以在不停止服务的情况下便捷地修改单个队列的最大队列数量。   ● 可以实时查看队列状态(入队列位置、出队列位置、未读队列数量、最大队列数量)。   ● 可以查看指定队列ID(队列点)的内容,包括未出、已出的队列内容。   ● 查看队列内容时,支持多字符集编码。   ●… Read more »

Python Queue 的多线程(multi thread)死锁问题

Posted by & filed under Programming.

废话不多说,先上代码: #encoding=utf-8 import threading import random import time from Queue import Queue import mutex   class Producer(threading.Thread):   def __init__(self, threadname, queue, lock): threading.Thread.__init__(self, name = threadname) self.sharedata = queue self.lock = lock   def run(self): for i in range(20): #—————- self.lock.acquire() print self.getName(),’<< ‘,i self.lock.release() #—————- self.sharedata.put(i) time.sleep(random.randrange(10)/50.0) #time.sleep(1) print self.getName(),’Finished’     #… Read more »

python满足你需要的50个模块

Posted by & filed under Excellence Article, Programming.

Python具有强大的扩展能力,网上有人列出了50个很棒的Python模块,包含几乎所有的需要:比如Databases,GUIs,Images, Sound, OS interaction, Web,以及其他。推荐收藏。 Graphical interface wxPython http://wxpython.org Graphical interface pyGtk http://www.pygtk.org Graphical interface pyQT http://www.riverbankcomputing.co.uk/pyqt/ Graphical interface Pmw http://pmw.sourceforge.net/ Graphical interface Tkinter 3000 http://effbot.org/zone/wck.htm Graphical interface Tix http://tix.sourceforge.net/ Database MySQLdb http://sourceforge.net/projects/mysql-python Database PyGreSQL http://www.pygresql.org/ Database Gadfly http://gadfly.sourceforge.net/ Database SQLAlchemy http://www.sqlalchemy.org/ Database psycopg http://www.initd.org/pub/software/psycopg/ Database kinterbasdb http://kinterbasdb.sourceforge.net/ Database cx_Oracle http://www.cxtools.net/default.aspx?nav=downloads Database pySQLite http://initd.org/tracker/pysqlite MSN Messenger msnlib http://auriga.wearlab.de/~alb/msnlib/ MSN Messenger pymsn http://telepathy.freedesktop.org/wiki/Pymsn MSN Messenger msnp http://msnp.sourceforge.net/ Network Twisted http://twistedmatrix.com/ Images PIL http://www.pythonware.com/products/pil/ Images gdmodule http://newcenturycomputers.net/projects/gdmodule.html… Read more »

Python解析iso8601时间格式获得时间戳

Posted by & filed under Programming.

关于iso8601数据交换标准,请参见维基百科的解释,中文版不完全解释,参见为维基百科中文版 常见示例格式如下: 2010-11-21T00:00:00+08:00 真实的案例,请参见美团网的团购API Python默认安装包中不能对iso8601格式的时间戳,因此先安装这个解析包,下载地址:http://pypi.python.org/pypi/iso8601/ 如果你不能在网站上找到对应Python版本的模块,也可以通过输入easy_install iso8601试试,我的是2.6版本,安装成功 解析过程很简单,代码如下: import time import iso8601 dt = iso8601.parse_date(’2010-11-21T00:00:00+08:00′) timestamp = time.mktime(dt.timetuple()) PS:感谢妖怪帮助我解决解析iso8601时间格式的问题

Python中给urllib2设置超时时间

Posted by & filed under Programming.

import socket import urllib2   socket.setdefaulttimeout(seconds)   open = urllib2.urlopen("http://xxx.xxx.xxx") urllib2本身是没有办法设置超时时间的,示例中是通过socket.setdefaulttimeout() 设置了全局默认超时时间,从而给urllib2.urlopen()也设置了默认的超时时间

python非贪婪、多行匹配正则表达式例子

Posted by & filed under Programming.

一些regular的tips: 1 非贪婪flag >>> re.findall(r”a(\d+?)”, “a23b”) ['2'] >>> re.findall(r”a(\d+)”, “a23b”) ['23'] 注意比较这种情况: >>> re.findall(r”a(\d+)b”, “a23b”) ['23'] >>> re.findall(r”a(\d+?)b”, “a23b”) ['23'] 2 如果你要多行匹配,那么加上re.S和re.M标志 re.S:.将会匹配换行符,默认.不会匹配换行符 >>> re.findall(r”a(\d+)b.+a(\d+)b”, “a23b\na34b”) [] >>> re.findall(r”a(\d+)b.+a(\d+)b”, “a23b\na34b”, re.S) [('23', '34')] >>> re.M:^$标志将会匹配每一行,默认^和$只会匹配第一行 >>> re.findall(r”^a(\d+)b”, “a23b\na34b”) ['23'] >>> re.findall(r”^a(\d+)b”, “a23b\na34b”, re.M) ['23', '34'] 但是,如果没有^标志, >>> re.findall(r”a(\d+)b”, “a23b\na23b”) ['23', '23'] 可见,是无需re.M